【垃圾回收算法与实现读书笔记】分代垃圾回收

一、分代

分代垃圾回收(Generational GC)在对象中导入了“年龄”的概念,通过优先回收容易成为垃圾的对象,提高垃圾回收的效率。

  1. 年龄:
    经历过一次 GC 后活下来的对象年龄加1。
  2. 新生代、老年代
    把刚生成的对象称为新生代对象,到达一定年龄的对象则称为老年代对象。

二、Ungar的分代垃圾回收

David Ungar 研究出来的把 GC 复制算法和分代垃圾回收这两者组合运用的方法。

【垃圾回收算法与实现读书笔记】分代垃圾回收
Ungar将堆划分为4个部分,分别是生成空间、2 个大小相等的幸存空间以及老年代空间。生成空间和幸存空间也可以合叫新生代空间。
此外再引入一个数组,称为记录集。

  • 生成空间:新的对象在这里诞生,当生成空间满后启动新生代GC,将所有有用的的对象移动到幸存空间。
  • 幸存空间:幸存空间就是来装新生代GC后活下来的对象,需要注意的是有两个幸存空间,但每次只能使用一个。新生代GC执行时会同时回收生成空间和正在使用者的那个幸存空间A,而幸存空间B此时是空着的,将生成空间和幸存空间A活下来的对象移动到幸存空间B。

【垃圾回收算法与实现读书笔记】分代垃圾回收

  • 老年代空间:达到年龄的对象移入老年代。
    当老年代空间满后,就执行老年代GC,一般是标记 - 清除算法。
    需要注意的是新生代GC时要考虑得到老年代空间里的对象的引用。

分代垃圾回收的优点是只将垃圾回收的重点放在新生代对象身上,以此来缩减 GC 所需要的时间。不过考虑到从老年代对象的引用,结果还是要搜索堆中的所有对象,这样一来就大大削减了分代垃圾回收的优势。

为了解决这个问题,就需要用到记录集。

  • 记录集:是用来记录从老年代对象到新生代对象的引用。这样在新生代 GC 时就可以不搜索老年代空间的所有对象,只通过搜索记录集来发现从老年代对象到新生代对象的引用。