最近在阅读<深入理解JVM>,其中在长期存活对象进入年老代的章节中,代码运行结果与书中不符,具体演示代码如下(jdk1.7.0_79)
1)当-XX:MaxTenuringThreshold=1时,结果符合预期,allocation1对象在第二次gc时被移至年老代.结果如图所示:
2)当-XX:MaxTenuringThreshold=15时,结果不符合预期,allocation1对象在第二次gc时仍然被移至年老代中,按理说年龄未达到15,不是应该存在于年轻代中吗?结果如图所示:
望大神指教,谢谢!!!
代码:
/**
* -XX:+UseSerialGC -verbose:gc -XX:+PrintGCDetails
* -Xms20M -Xmx20M -Xmn10M -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=1
* -XX:+UseSerialGC -verbose:gc -XX:+PrintGCDetails -Xms20M -Xmx20M -Xmn10M
* -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=1
*/
public static void testTenuringThreshold() {
byte[] allocation1, allocation2, allocation3;
allocation1 = new byte[_1MB / 4];
allocation2 = new byte[4 * _1MB];
allocation3 = new byte[4 * _1MB];
allocation3 = null;
allocation3 = new byte[4 * _1MB];
}
public static void main(String[] args) {
testTenuringThreshold();
}
我跟你一样,用7u80
和8
测试都不是预期结果。。然后,换成了6u45
,就可以了。。
可能确实某个版本的改动影响了这个结果吧,书中作者说了,他的版本是7u6
。
-XX:TargetSurvivorRatio 试了下,需要把这个值调高点,我设置成90就可以了
我也试了,就是不生效jdk1.7.0_51,孙艺铸,哈哈
虚拟机并不总是要求对象的年龄必须达到MaxTenuringThreshold才能晋升到老年代,如果在Survivor区中相同年龄(设年龄为age)的对象的所有大小之和超过Survivor空间的一半,年龄大于或等于该年龄(age)的对象就可以直接进入老年代,无需等到MaxTenuringThreshold中要求的年龄。
你虚拟机参数这样设置,从来不会发生复制算法,复制次数永远为0!因为新生代一直在gc,没有一个对象进入老年代