JVM选项:
-Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8
如预期所见,JVM将为JVM堆分配近20MB的内存。
但请查看以下GC详细信息:
PSYoungGen 总共 9216K,已使用 4612K [0x00000000ff600000,0x0000000100000000,0x0000000100000000)
eden space 8192K,使用56% [0x00000000ff600000,0x00000000ffa812d8,0x00000000ffe00000)
from space 1024K,未使用 [0x00000000fff00000,0x00000000fff00000,0x0000000100000000)
to space 1024K, 未使用 [0x00000000ffe00000, 0x00000000ffe00000, 0x00000000fff00000)
PSOldGen 总共 10240K,已使用 8192K [0x00000000fec00000,0x00000000ff600000,0x00000000ff600000)
对象空间 10240K,80%使用 [0x00000000fec00000,0x00000000ff400020,0x00000000ff600000)
PSPermGen 总共 21248K,已使用 3033K [0x00000000f9a00000,0x00000000faec0000,0x00000000fec00000)
对象空间 21248K,14%使用 [0x00000000f9a00000,0x00000000f9cf6708,0x00000000faec0000)
年轻代的大小符合-Xmn
选项的预期。在年轻代中,eden space和survivor spaces的大小比率符合-XX:SurvivorRatio=8
选项的预期。但是总体上看,JVM分配了近40MB内存,这很奇怪。为什么JVM总分配的内存大于-Xmx
?
环境:
操作系统:win7 64位
JDK版本:build 1.6.0_43-b01 64位
PSYoungGen
和 老年代PSOldGen
。堆不包含永久代PSPermGen
。顺便说一下,PS
代表并行清理收集器(使用-XX:UseParallelGC
启用)。 - DontDivideByZeroPSYoungGen total 9216K
+PSOldGen total 10240K
=19456K
= 19MB)比使用-Xms20M
指定的最小堆大小还要小,那么请参考这里的讨论:[http://stackoverflow.com/q/28362435/3460717]。 - DontDivideByZero