首页 > 解决方案 > -XX:MaxPermSize 设置未反映

问题描述

我在 Linux 服务器上的应用程序中使用以下 JVM opts

-server -Xms3g -Xmx3g -Xmn512m -XX:MaxPermSize=256m -Xss256k -Xloggc:${gc_log_file} 
-verbose:gc -XX:+DoEscapeAnalysis -XX:+PrintGCTimeStamps -XX:+PrintGCDetails
-XX:+PrintGCApplicationStoppedTime 
-XX:+PrintGCDateStamps -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParallelGC 
-XX:TargetSurvivorRatio=80 
-Dsun.rmi.dgc.server.gcInterval=300000 -Dsun.rmi.dgc.client.gcInterval=300000 
-XX:+AggressiveOpts 
-XX:+PrintTenuringDistribution -XX:+PrintConcurrentLocks -XX:MaxTenuringThreshold=20

但是此设置在该节点上无效,并且 MaxPermSize 被视为140m而不是256m

细节:

MemTotal:        5925728 kB
java version     "1.7.0_251"

PSYoungGen      total 471040K, used 122995K [0x00000007e0000000, 0x0000000800000000, 0x0000000800000000)
eden space 416256K, 25% used [0x00000007e0000000,0x00000007e6784d38,0x00000007f9680000)
from space 54784K, 31% used [0x00000007fca80000,0x00000007fdb18000,0x0000000800000000)
to   space 53248K, 0% used [0x00000007f9680000,0x00000007f9680000,0x00000007fca80000)
ParOldGen       total 2621440K, used 1146547K [0x0000000740000000, 0x00000007e0000000, 0x00000007e0000000)
object space 2621440K, 43% used [0x0000000740000000,0x0000000785face28,0x00000007e0000000)
PSPermGen       total 140800K, used 140471K [0x0000000730000000, 0x0000000738980000, 0x0000000740000000)
object space 140800K, 99% used [0x0000000730000000,0x000000073892de90,0x0000000738980000)

根据 gclog 声明,PermGen 在达到 140m 时达到 99%

对象空间 140800K,已使用 99%

如何强制 Java 进程考虑 MaxPermSize VM 选择 PermGen?

标签: javajvmjvm-argumentspermgenjdk1.7

解决方案


 PSPermGen       total 140800K, used 140471K
  object space 140800K, 99% used

140800K是分配的永久代,而不是可分配的最大值。

我没有 PermGen OOM,因为当应用程序达到 99% 时我正在杀死我的应用程序

如果你不杀死它,你会看到永久代不断增长以适应新的分配。


推荐阅读