参考 《深入理解Java虚拟机 JVM高级特性与最佳实践》 3.6节
1.对象优先在Eden分配
- Minor GC:新生代的GC
- Major GC:老年代的GC
-
分配对象时发现新生代不够=>开启Minor GC=>Minor GC后发现存活下来的对象Survivors太大,无法放入Survivor空间=>启动分配担保机制把Survivors放入老年代中去
2.大对象直接进入老年代
- 虚拟机提供了-XX:pretenureSizeThreshold来控制当对象大于多少的时候,直接进入老年代
3.长期存活的对象进入老年代
- 虚拟机为每个对象定义了一个对象年龄计数器,每熬过一次GC,年龄就加一岁,默认情况下,超过15岁就会被放入老年代
- 虚拟机提供了-XX:MaxTenuringThreshold来控制进入老年代的岁数
4.动态对象年龄判定
- 如果Survivor空间中相同年龄(Y岁)的对象总和大小大于Survivor空间的一半,则大于Y岁的对象可以直接进入老年代,无需等到MaxTenuringThreshold设定的年龄
5.空间分配担保
- 空间分配担保,担保的其实就是GC后存活的对象如果晋升到老年代,那么老年代要保证能容纳下这些“新人”。如果不能保证,则按照以前每次回晋升上来的新人数量平均值,跟老年代还剩下的控件做对比,如果剩余空间够,就进行Minor GC,但是这样也是有风险的,因为如果某次GC存活的对象量大大超过平时的经验值,那么老年代将没有足够的空间来放置这些对象,那么就要进行一次Major GC,也就是Full GC,而Full GC要费时的多,这个是要尽量避免的