为了账号安全,请及时绑定邮箱和手机立即绑定

对于大对象Minor GC的疑问

对于大对象Minor GC的疑问

qq_花开花谢_0 2019-01-17 23:50:46
一个很简单的GC测试,但是没有打印出预期的效果。JDK1.8.0_131,JVM参数如下: -Xmx50m -Xms50m -Xmn8m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+PrintGC public static void main(String[] args) { Object[] list = new Object[10]; for(int i=0; i<10 ; i++) { System.out.println(">>>>>>>>>>" + i); list[i] = new byte[3*1024*1024]; } } console打印如下: >>>>>>>>>>0 >>>>>>>>>>1 >>>>>>>>>>2 >>>>>>>>>>3 >>>>>>>>>>4 >>>>>>>>>>5 >>>>>>>>>>6 >>>>>>>>>>7 >>>>>>>>>>8 >>>>>>>>>>9 Heap PSYoungGen total 6144K, used 2139K [0x00000000ff800000, 0x0000000100000000, 0x0000000100000000) eden space 4096K, 52% used [0x00000000ff800000,0x00000000ffa16fa0,0x00000000ffc00000) from space 2048K, 0% used [0x00000000ffe00000,0x00000000ffe00000,0x0000000100000000) to space 2048K, 0% used [0x00000000ffc00000,0x00000000ffc00000,0x00000000ffe00000) ParOldGen total 43008K, used 30720K [0x00000000fce00000, 0x00000000ff800000, 0x00000000ff800000) object space 43008K, 71% used [0x00000000fce00000,0x00000000fec000a0,0x00000000ff800000) Metaspace used 3498K, capacity 4498K, committed 4864K, reserved 1056768K class space used 387K, capacity 390K, committed 512K, reserved 1048576K 虽然最终看到对象进入了老年代,但是Minor GC的过程都没有打印出来,如果将new byte[3*1024*1024] 改为 new byte[1*1024*1024],即如下如所示: public static void main(String[] args) { Object[] list = new Object[10]; for(int i=0; i<10 ; i++) { System.out.println(">>>>>>>>>>" + i); list[i] = new byte[1*1024*1024]; } } console打印如下: >>>>>>>>>>0 >>>>>>>>>>1 [GC (Allocation Failure) [PSYoungGen: 3081K->1896K(6144K)] 3081K->1904K(49152K), 0.0014582 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] >>>>>>>>>>2 >>>>>>>>>>3 >>>>>>>>>>4 [GC (Allocation Failure) [PSYoungGen: 5087K->1864K(6144K)] 5095K->4944K(49152K), 0.0017647 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] >>>>>>>>>>5 >>>>>>>>>>6 >>>>>>>>>>7 [GC (Allocation Failure) [PSYoungGen: 5124K->1784K(6144K)] 8204K->7936K(49152K), 0.0012156 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] >>>>>>>>>>8 >>>>>>>>>>9 Heap PSYoungGen total 6144K, used 5009K [0x00000000ff800000, 0x0000000100000000, 0x0000000100000000) eden space 4096K, 78% used [0x00000000ff800000,0x00000000ffb26620,0x00000000ffc00000) from space 2048K, 87% used [0x00000000ffc00000,0x00000000ffdbe040,0x00000000ffe00000) to space 2048K, 0% used [0x00000000ffe00000,0x00000000ffe00000,0x0000000100000000) ParOldGen total 43008K, used 6152K [0x00000000fce00000, 0x00000000ff800000, 0x00000000ff800000) object space 43008K, 14% used [0x00000000fce00000,0x00000000fd402060,0x00000000ff800000) Metaspace used 3495K, capacity 4498K, committed 4864K, reserved 1056768K class space used 387K, capacity 390K, committed 512K, reserved 1048576K 可以看到有清楚的Minor GC的过程,这是为什么呢?是JVM对这种大对象做了优化以至于直接分配至老年代了吗?
查看完整描述

1 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

深入理解JVM里面不是有嘛,大对象直接进入老年代

查看完整回答
反对 回复 2019-02-12
  • 1 回答
  • 0 关注
  • 627 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号