确定型唯一强引用链gc算法

有可能成立的新GC算法,欢迎大家讨论

每个值,记录引用与被引用关系。
被引用关系中,只有一个是强引用,其他全是弱引用。
由值的引用关系图中,对于一个值,有且只有一种强引用链直通到根。

值引用图

其中直线是强引用,虚线是弱引用

当弱引用断掉后,不需要做处理。
当强引用断掉后,
将该引用链后段的所有强引用全部置为弱引用,并将涉及到的值都记录起来, 记为tmp_values

此时tmp_values中的所有值都只存在弱引用关系。
如下图所示(A->C的引用断掉):

A->C的引用断掉,该引用链后段所有的强引用全部置为弱引用

遍历 tmp_values,寻找被引用关系的上级,该上级带有强引用,
如果没有找到,就跳过。
如果有找到,就更新该被引用关系为强引用。

再次遍历tmp_values
如果当前tmp_value带有强引用,
则从它出发的所有只有弱引用的值,都将引用更新为强引用。如下图所示,绿色的强引用是重新寻找到的强引用:

image.png

再次遍历tmp_values
删除所有未带有强引用的值,如下图所示:

唯一强引用链重建,只有弱引用的C、G、D都将被删除

gc完成。

比喻

每个人在一家公司里都要站队,如果上司倒了,就重新站队(要被使用),重新站队后,你下属的链就保全了。
没能重新站队的人,就被fire了

优势

  • 引用关系掉后,垃圾数据立刻被清掉,没有mark-and-sweap gc算法的延迟。
  • 因为是立即清掉垃圾数据,所以内存也不会被无效数据占掉
  • 因为是立即清掉垃圾数据,所以也不需要stop-the-world
  • 因为是立即清掉垃圾数据,所以也可以做RAII
  • 相比引用计数,没有循环引用的问题,因为同时最多一个强引用

不足

  • 相比mark-and-sweap gc 要多记录 被引用关系来重建强引用
  • 清理时,需要遍历强引用链后段数据三次

你可能感兴趣的:(确定型唯一强引用链gc算法)