为什么Eden内存在64位JVM中不断增加,而在32位JVM中则不然?

时间:2017-11-07 08:57:28

标签: java memory-management garbage-collection jvm hotspot

我在32位JVM和64位JVM上运行了以下简单代码,发现32位JVM中没有GC,但64位JVM保留了较小的GC

public static void main(String[] args) {

    byte[] b = new byte[1024 * 1024 / 2];

    while (true) {
       // do nothing
    }
}
  1. 32位 JVM上运行:

    命令:

    “C:\ Program Files(x86)\ Java \ jdk1.7.0_51 \ bin \ java.exe”-XX:+ PrintGCDetails -XX:NewSize = 10m -XX:MaxNewSize = 10m -Xms20m -Xmx20m -XX: SurvivorRatio = 8测试

    结果

    0.5MB对象留在伊甸园空间,没有 gc发生

    1. 64位 JVM上运行:

      命令:

      “C:\ Program Files \ Java \ jdk1.8.0_45 \ bin \ java.exe”-XX:+ PrintGCDetails -XX:NewSize = 10m -XX:MaxNewSize = 10m -Xms20m -Xmx20m -XX:SurvivorRatio = 8测试

      结果

      Eden空间不断增加并最终触发了许多次要GC,日志如下所示:

    2. [GC(分配失败)[PSYoungGen:8192K-> 992K(9216K)] 8192K-> 2176K(19456K),0.0030304秒] [时间:用户= 0.00 sys = 0.00,实际= 0.00秒]

      [GC(分配失败)[PSYoungGen:9184K-> 992K(9216K)] 10368K-> 2296K(19456K),0.0019422秒] [时间:用户= 0.00 sys = 0.00,实际= 0.00秒]

      [GC(分配失败)[PSYoungGen:9184K-> 992K(9216K)] 10488K-> 2352K(19456K),0.0023896 secs] [次:用户= 0.00 sys = 0.00,实际= 0.00秒]

      [GC(分配失败)[PSYoungGen:9184K-> 1008K(9216K)] 10544K-> 2448K(19456K),0.0019188秒] [时间:用户= 0.00 sys = 0.00,实际= 0.00秒]

      PSYoungGen总计9216K,使用9051K [0x00000000ff600000,0x0000000100000000,0x0000000100000000]

      伊甸园空间8192K,98%使用[0x00000000ff600000,0x00000000ffddaf00,0x00000000ffe00000)

      来自空间1024K,98%使用[0x00000000fff00000,0x00000000ffffc020,0x0000000100000000)

      到空格1024K,0%使用[0x00000000ffe00000,0x00000000ffe00000,0x00000000fff00000)

      ParOldGen总计10240K,使用1440K [0x00000000fec00000,0x00000000ff600000,0x00000000ff600000]

      对象空间10240K,14%使用[0x00000000fec00000,0x00000000fed68050,0x00000000ff600000)

      Metaspace使用8032K,容量8288K,承诺8448K,保留1056768K

      类空间使用943K,容量984K,承诺1024K,保留1048576K

      通过查看Visual GC Graphs,我发现Eden空间不断增加,我很困惑为什么会发生这种情况,因为我只创建了一个只有0.5MB的对象?看起来有很多其他对象被创建,但那些是什么?

      有人可以分享一些知识吗?非常感谢!

0 个答案:

没有答案