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

标签 java memory jvm-arguments

JVM 选项:

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

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

但是请看下面的GC细节:

PSYoungGen total 9216K, used 4612K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)
eden space 8192K, 56% used [0x00000000ff600000,0x00000000ffa812d8,0x00000000ffe00000)
from space 1024K, 0% used [0x00000000fff00000,0x00000000fff00000,0x0000000100000000)
to space 1024K, 0% used [0x00000000ffe00000,0x00000000ffe00000,0x00000000fff00000)
PSOldGen total 10240K, used 8192K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)
object space 10240K, 80% used [0x00000000fec00000,0x00000000ff400020,0x00000000ff600000) PSPermGen total 21248K, used 3033K [0x00000000f9a00000, 0x00000000faec0000, 0x00000000fec00000)
object space 21248K, 14% used [0x00000000f9a00000,0x00000000f9cf6708,0x00000000faec0000)

年轻一代的大小与选项-Xmn 的预期一致。 年轻一代eden spacesurvivor spaces 的大小比例与选项-XX:SurvivorRatio=8 的预期一致但是 JVM 似乎总共分配了将近 40MB 的内存,所以很奇怪。为什么 JVM 总分配内存大于 -Xmx

环境:

操作系统:win7 64位

JDK:构建 1.6.0_43-b01 64 位

最佳答案

-Xmx 设置 HotSpot 对象堆的最大大小,即 YoungGen(Eden + Survivor-spaces)和 OldGen 的总和,约为 20 MB。永久代驻留在这个堆之外的一个单独的内存区域中,该区域通过 -XX:MaxPermSize 选项控制。

关于java - 为什么 JVM 总分配内存大于 -Xmx?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20739661/

相关文章:

java - 使用 Gson 序列化具有非原始值的对象的 ArrayList?

java - 如何声明静态嵌套对象

c# - C#直接访问DirectDraw表面内存

c# - 试图读写 protected 内存

java - 如何确定是否在 JVM 实例上设置了 -server 选项

java - 使用 UseConcMarkSweepGC 减少 JVM 暂停时间 > 1 秒

java - 如何微调 JVM 配置以减少最大线程堆栈大小?

java - 静态成员的顺序在 Swing 中是否敏感?

java - getClass() getResource 返回 null

c - malloc有什么用?为什么不只是...不使用它?