我在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
}
}
在 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发生
在 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,日志如下所示:
[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的对象?看起来有很多其他对象被创建,但那些是什么?
有人可以分享一些知识吗?非常感谢!