为什么JVM总分配内存大于-Xmx?

7

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位

1个回答

11

-Xmx设置了HotSpot对象堆的最大大小,即YoungGen(Eden + Survivor区域)和OldGen的总和,大约为20MB。永久代位于此堆之外,位于单独的内存区域中,可以通过-XX:MaxPermSize选项进行控制。


这意味着堆被分为两代:YoungGen和OldGen,不包括PermGen? - Liping Huang
@LipingHuang 是的,没错。堆被分为年轻代 PSYoungGen老年代 PSOldGen。堆不包含永久代 PSPermGen。顺便说一下,PS 代表并行清理收集器(使用 -XX:UseParallelGC 启用)。 - DontDivideByZero
@LipingHuang “年轻代”进一步分为“伊甸园区(eden space)”和两个“幸存者区(survivor spaces)”,分别称为“from space”和“to space”。然而,仅有一个“幸存者区”对“年轻代”大小所做的贡献被记录在这里 - DontDivideByZero
@LipingHuang 如果你想知道为什么总堆大小(PSYoungGen total 9216K + PSOldGen total 10240K = 19456K = 19MB)比使用 -Xms20M 指定的最小堆大小还要小,那么请参考这里的讨论:[http://stackoverflow.com/q/28362435/3460717]。 - DontDivideByZero
@DontDivideByZero 这个链接帖子已经被删除了。还有其他的参考资料吗? - Lebecca

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接