问题描述
我正在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%时我将其杀死。
如果不杀死它,您将看到永久的一代正在增长以适应新的分配。