java 直接进入老年代_JVM直接进入老年代条件长期存活对象同年对象达到幸存者空间一半...

原标题:JVM直接进入老年代条件长期存活对象同年对象达到幸存者空间一半

长期存活的对象将进入老年代

虚拟机给每个对象定义了对象年龄(Age)计数器。如果对象在Eden出生并经过第一次Minor GC后仍然存活,并且能被Survivor容纳的话,将被移动到Survivor空间中,对象年龄设为1。对象在Survivor区中每“熬过”一次Minor GC,年龄就增加1岁,当它的年龄增加到一定程度(默认为15岁),就将会被晋升到老年代中。

长期存活的对象将进入老年代——设置对象晋升老年代的年龄阈值

-XX:MaxTenuringThreshold

长期存活的对象将进入老年代——-XX:MaxTenuringThreshold=1

testTenuringThreshold()方法,此方法中的allocation1对象需要256KB内存,Survivor空间可以容纳。当MaxTenuringThreshold=1时,allocation1对象在第二次GC发生时进入老年代,新生代已使用的内存GC后非常干净地变成0KB。

aa61e1941eebfed74b78fa3b63008b6b.png

长期存活的对象将进入老年代——-XX:MaxTenuringThreshold=15

而MaxTenuringThreshold=15时,第二次GC发生后,allocation1对象则还留在新生代Survivor空间,这时新生代仍然有404KB被占用。

e88c687a9dfc22ba72a5ec834a50c095.png

动态对象年龄判定

为了能更好地适应不同程序的内存状况,虚拟机并不是永远地要求对象的年龄必须达到了`MaxTenuringThreshold才能晋升老年代,如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到MaxTenuringThreshold中要求的年龄。

动态对象年龄判定——同年对象达到Survivor空间的一半

fa512d9c5e61361719a23d2a65ff8250.png

allocation1、allocation2对象都直接进入了老年代,而没有等到15岁的临界年龄。因为这两个对象加起来已经到达了512KB,并且它们是同年的,满足同年对象达到Survivor空间的一半规则。

ea679a88e73432757a958fa8d6c5e1ee.png

动态对象年龄判定——同年对象不达到Survivor空间的一半

只要注释掉其中一个对象new操作,就会发现另外一个就不会晋升到老年代中去了。

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值