Open
Description
原文:如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到-XX:MaxTenuringThreshold中要求的年龄
这段话不知道是基于哪个版本的JVM得出的结论,
实际代码:
uint ageTable::compute_tenuring_threshold(size_t survivor_capacity) {
//survivor_capacity是survivor空间的大小
size_t desired_survivor_size = (size_t)((((double) survivor_capacity)*TargetSurvivorRatio)/100);
size_t total = 0;
uint age = 1;
while (age < table_size) {
total += sizes[age];//sizes数组是每个年龄段对象大小
if (total > desired_survivor_size) break;
age++;
}
uint result = age < MaxTenuringThreshold ? age : MaxTenuringThreshold;
...
}
得出的结论是:
从最小的年龄对象大小开始累加,当达到n大小时如果总和大于TargetSurvivorRatio设定的阀值那么大于等于n年龄的对象就会晋升到老年代。
而不是:
相同的某一个年龄的累加大小
Activity
fenixsoft commentedon Mar 22, 2020
感谢。已更新至勘误。
查了jdk 7u6的源码,当时逻辑就是如此了。应该就是写下这段内容时理解有误,而不是源码发生过什么改动。TargetSurvivorRatio的默认值为50,所以订正为:
zhangshuge commentedon Jan 16, 2021
为什么我本地验证的时候需要将TargetSurvivorRatio调至60以上才能符合预期?默认的50时,一个256K的变量就能晋级老年代。