JVM晋升老年代总结

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年龄的对象都会晋升到老年代。

你可能感兴趣的:(jvm,java)