-XX:MaxPermSize设置未反映

问题描述

我正在Linux服务器上的应用程序中使用下面的JVM选项

-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进程考虑PermGen的MaxPermSize VM选择?

解决方法

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

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

我没有PermGen OOM,因为当应用程序达到99%时我将其杀死。

如果不杀死它,您将看到永久的一代正在增长以适应新的分配。