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

Java 为什么JVM总分配内存大于-Xmx?,java,memory,jvm-arguments,Java,Memory,Jvm Arguments,JVM选项: -Xms20M-Xmx20M-Xmn10M-XX:+PrintGCDetails-XX:SurvivorRatio=8 正如预期的那样,JVM将为JVM堆分配近20MB的内存 但请参见以下GC详细信息: PSYoungGen总计9216K,使用4612K[0x00000000ff600000,0x0000000100000000,0x0000000100000000) 伊甸园空间8192K,56%已使用[0x00000000ff600000,0x00000000ffa812d8,0

JVM选项:

-Xms20M-Xmx20M-Xmn10M-XX:+PrintGCDetails-XX:SurvivorRatio=8

正如预期的那样,JVM将为JVM堆分配近20MB的内存

但请参见以下GC详细信息:

PSYoungGen总计9216K,使用4612K[0x00000000ff600000,0x0000000100000000,0x0000000100000000)
伊甸园空间8192K,56%已使用[0x00000000ff600000,0x00000000ffa812d8,0x00000000ffe00000)
从空间1024K,0%已使用[0x00000000fff00000,0x00000000fff00000,0x0000000100000000)
到空格1024K,0%已使用[0x00000000FF00000,0x00000000FF00000,0x00000000fff00000)
PSOldGen总计10240K,使用8192K[0x00000000fec00000,0x00000000ff600000,0x00000000ff600000)
对象空间10240K,80%已使用[0x00000000fec00000,0x00000000ff400020,0x00000000ff600000) PSPermGen总计21248K,使用3033K[0x00000000f9a00000,0x00000000faec0000,0x00000000fec00000)
对象空间21248K,已使用14%[0x00000000F9A000000,0x00000000f9cf6708,0x00000000faec0000)

年轻一代的大小与选项
-Xmn
所预期的一样。年轻一代的eden空间和幸存者空间的大小之比与选项
-XX:surviorratio=8
所预期的一样,但是看起来JVM总共分配了近40MB的内存,所以这很奇怪。为什么JVM的总分配空间是40 MBed内存大于
-Xmx

Env:

操作系统:win7 64位


JDK:build 1.6.0_43-b01 64位设置热点对象堆的最大大小,即YoungGen(伊甸园+幸存者空间)的总和和OldGen,大约是20 MB。永久性的一代驻留在这个堆之外的一个单独的内存区域中,该区域由
-XX:MaxPermSize
选项控制。

这意味着堆分为两代:YoungGen和OldGen,不包含PermGen?@LipingHuang是的,这是正确的。堆分为young g生成,
PSYoungGen
,旧一代,
PSOldGen
。堆不包含永久生成,
PSPermGen
。顺便说一下,
PS
代表并行清除收集器(使用
-XX:UseParallelGC
启用)@LipingHuang年轻一代被进一步划分为伊甸园空间和两个幸存者空间,称为“从空间”和“到空间”。但是,正如前面所讨论的,只有一个幸存者空间对年轻一代的指定大小起作用。@LipingHuang如果您想知道为什么堆的总大小(
PSYoungGen总计9216K
+
PSOldGen总计10240K
=
19456K
=19MB)小于使用
-Xms20M
指定的最小堆大小,请参阅讨论。