3.6 内存分配与回收策略

参考 《深入理解Java虚拟机 JVM高级特性与最佳实践》 3.6节

1.对象优先在Eden分配

  • Minor GC:新生代的GC
  • Major GC:老年代的GC
  • 分配对象时发现新生代不够=>开启Minor GC=>Minor GC后发现存活下来的对象Survivors太大,无法放入Survivor空间=>启动分配担保机制把Survivors放入老年代中去


    3.6 内存分配与回收策略_第1张图片

    3.6 内存分配与回收策略_第2张图片
    Snip20170103_11.png

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要费时的多,这个是要尽量避免的

你可能感兴趣的:(3.6 内存分配与回收策略)