1. 担保机制
当Survivor区的的内存大小不足以装下下一次Minor GC所有存活对象时,就会启动担保机制,把Survivor区放不下的对象放到老年代;
2. 大对象直接放入老年代
大对象(大小大于-XX:PretenureSizeThreshold的对象)直接在老年代分配内存;(只对Serial和ParNew收集器有效,对于Parallel Scavenge收集器无效)
3.长期存活的对象进入老年代
把age大于-XX:MaxTenuringThreshold的对象晋升到老年代;(对象每在Survivor区熬过一次,其age就增加一岁);
4.动态年龄判断
看一段JVM源码
uint ageTable::compute_tenuring_threshold(size_t survivor_capacity) {
//survivor_capacity是survivor空间的大小,计算期望的在回收之后的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;
...
}
TargetSurvivorRatio为我们设置的JVM参数-XX:TargetSurvivorRatio其默认值为50,从代码中可以看到会记录1->n的年龄对象的总内存和,当此值大于我们期望值时,就设置MaxTenuringThreshhold为该age,即>=此age年龄的对象都会晋升到老年代。