简单的增量式垃圾回收
通过这段时间对tinypy源码和编译原理这本书的研究,我终于敲开了增量式垃圾回收的“小门”;如果读者没有接触过基本的标记-清扫垃圾回收,最好先对其进行一定的了解。
一、数据结构
列表:
- 所有对象集合,标记为R,
- 未扫描对象集合,标记为U,
- 垃圾对象集合,标记为G
二、算法的理论基础
- 不可达对象永远不会变成可达对象。
- 树的遍历(增量标记的核心)
三、算法的执行过程
初始化
- 初始化栈和对象的树;
- 将根对象push进U;
增量标记
(实质上是对可达对象的树进行广度优先的遍历过程,这个过程中会产生一些被称之为“漂浮垃圾”的对象,他们已经不可达,但是仍然在U集合里面,由于他们不可能再次被引用,所以在下一轮FullGC过程中会被清除)
- 从U中pop出一个对象
- 如果该对象已经标记为1,退出过程
- 如果该对象有子节点,将子节点push进U
- 标记该对象为1
- (这个过程也可以增量清除G中的垃圾对象)
生成新对象
- 标记该对象为1
- 将新对象push进U
- 执行两步增量标记,保证U不断减小
- 如果U为空,则表明所有对象都被标记过了