【垃圾回收算法与实现读书笔记】标记-压缩算法(标记-整理算法)

标记-压缩算法

GC 标记 - 压缩算法(Mark Compact GC)是将 GC 标记 - 清除算法与 GC 复制算
法相结合的产物。

一、Lisp2算法

标记阶段与标记-清除算法一样,压缩阶段就是让有用的对象覆盖掉没用的对象,这比复制算法好,不用牺牲半个堆空间。
完成该算法实现,至少要遍历3次堆:

  1. 找到有用的对象前面没用的对象
  2. 移动指针
  3. 移动对象。

优点:

可有效利用堆

缺点:

遍历三次堆不好,存在还进的空间。

二、Two-Finger算法

这是一种高效的算法,具体来说就是需要搜索 2 次堆。
Two-Finger 算法有着很大的制约条件,那就是“必须将所有对象整理成大小一致”。之前介绍的算法都没有这种限制,而 Two -Finger 算法就必须严格遵守这个制约条件。原因我们会在之后的内容中进行说明。

该算法的实现就是将List2算法的第一次遍历与第三次遍历合并,找到没用的对象后直接拿有用的对象替换它。这样一来不仅不需要存储没用的对象指针,也可以使遍历次数减少为两次:

  1. 移动对象
  2. 更新指针

优点:

相较于List2算法,即减少了时间,也减少了空间。

缺点:

  1. 制约条件,那就是“必须将所有对象整理成大小一致
  2. 无法保证有引用关系的对象在堆内相邻,所以无法使用缓存技术。

三、表格算法

这个算法和 Two-Finger 算法一样,都是执行 2 次压缩操作。

表格算法通过以下 2 个步骤来执行压缩:

  1. 移动对象(群)以及构筑间隙表格(break table)
  2. 更新指针

优点:

  1. 没有必要为压缩准备出多余的空间
  2. 保证有引用关系的对象在堆内相邻,可以使用缓存技术

缺点:

维护表格的代价比较大

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值