Java的垃圾回收机制、年轻代与老年代

时间:2024-05-31 11:29:46

1 被判定为垃圾的标准

没有被其它对象引用

2 判定对象是否为垃圾的算法

  • 引用计数法
  • 可达性分析算法

2.1 引用计数法

通过判断对象的引用数量来决定对象是否可以被回收
每个对象实例都有一个引用计数器,被引用则+1,完成引用则-1。
任何引用计数为0的都可以被当做是垃圾。

优点
执行效率高(只需要查找出引用计数为0的即可),程序受影响小
缺点
当出现循环引用的时候(父对象有一个对子对象的引用,子对象又反过来引用父对象。或者出现两个对象相互引用),引用计数不可能为0,也就是不能被回收,可能造成内存泄露
比如:
Java的垃圾回收机制、年轻代与老年代

2.2 可达性分析算法

通过判断对象的引用链是否可达来判断对象是否可回收
Java的垃圾回收机制、年轻代与老年代
什么对象可以作为GC 的root对象
Java的垃圾回收机制、年轻代与老年代

3 垃圾回收的算法

3.1 标记-清除算法(Mark and Sweep)

标记:从根集合进行扫描,对存活的对象进行标记。
清除:对堆内存进行线性遍历,回收不可达对象内存。
Java的垃圾回收机制、年轻代与老年代

3.2 复制算法(Copying)适用于对象存活率低的场景(年轻代中),因为需要复制的对象少。年轻代与老年代后面会介绍到。

  • 分为对象面和空闲面
  • 对象在对象面中创建
  • 存活的对象会被复制到空闲面
  • 复制之后将对象面中所有对象全部清除
    Java的垃圾回收机制、年轻代与老年代

3.3 标记整理(Compacting)适合存活率高(例如老年代中)

标记:从根集合进行扫描标记存活的对象
清除:移动所有存活的对象,按照内存地址次序依次排列,然后将末端地址以后的所有对象清除
Java的垃圾回收机制、年轻代与老年代

3.4 分代收集算法(Generational Collector)

年轻代、老年代、永久代?
Java的垃圾回收机制、年轻代与老年代
Java的垃圾回收机制、年轻代与老年代
年轻代:进可能快速收集生命周期短的对象
一般分为:一个Eden区,两个survivor区Java的垃圾回收机制、年轻代与老年代
年轻代回收演示(Minor GC):
Java的垃圾回收机制、年轻代与老年代
对象在什么时候会进入老年代
1、当年龄到达默认最大值时,对象会晋升老年代。默认15,可通过该参数设置
Java的垃圾回收机制、年轻代与老年代
2、Survivor中放不下的
3、新生成的大对象Java的垃圾回收机制、年轻代与老年代
分代收集算法特点
Java的垃圾回收机制、年轻代与老年代
**老年代:**存放生命周期较长的对象,使用标记-清理或标记-整理方法
Major GC 是清理永久代。
Full GC 是清理整个堆空间—包括年轻代和永久代。
Full GC比 Minor GC慢 ,但执行频率低
触发条件:
Java的垃圾回收机制、年轻代与老年代
常用调优参数
Java的垃圾回收机制、年轻代与老年代
分代收集的GC分类:

  • Minor GC (年轻代中的垃圾收集,采用复制算法)
  • Full GC 老年代中,由于对老年代的回收一般会伴随年轻代,所以叫做Full GC

后面的垃圾回收器等等有机会再补充。