标记和扫描垃圾收集中的指针反转会给你带来什么?

时间:2012-04-23 16:22:53

标签: pointers compiler-construction garbage-collection

我觉得我错过了一些非常简单的东西但是我试图理解标记和扫描垃圾收集每个Andrew Appel的现代编译器实现在ML书中,并且在Mark和Sweep部分中有一个标题为Pointer Reversal(270)的小段落。

此时我想我明白它是如何运作的。简而言之,当您遍历图形时,您可以翻转所有指针,以便您的前任位于您的字段集中。然后当你完成一个给定的元素时,你将指针向后翻转,使它们再次指向正确的位置。

如果这是正确的,那究竟是什么给你买的? Appel试图解释这一点,但我并没有完全理解他的措辞。

1 个答案:

答案 0 :(得分:11)

在标记过程中,对象分为三类:

  1. 尚未标记的对象
  2. 已标记但可指向未标记对象的对象
  3. 已标记并仅指向标记对象的对象
  4. 随着标记的进行,对象将状态从类别1更改为类别2,从类别2更改为类别3。 垃圾收集器必须跟踪类别2中的所有对象,以便它可以找到所有未标记的对象。但它在哪里存储这些信息?当内存完全填满时,垃圾收集可能正在运行,因此无法动态分配数据结构。它应该使用已经分配的内存构建一个包含类别2 中对象的数据结构。指针反转是一种用于构建这些对象的链接列表而不分配内存的算法。