0

我正在阅读垃圾收集。Algorithmis for Automatic Dynamic Memory Management一书,并试图写一篇关于它的博客文章。我专注于标记扫描一章,作者讨论使用辅助堆栈,以避免标记扫描溢出“正常”堆栈。到现在为止还挺好。

在专门讨论辅助栈的栈溢出的小节里,直接引用了一句:

Knuth 通过循环处理标记堆栈来处理溢出,将指向节点的指针堆栈以 h 为模,其中 h 是堆栈的固定大小。这意味着当堆栈索引增长大于 h 时,堆栈上较旧的分支点信息将被覆盖。因此,堆栈可能在标记过程完成之前变空,因为标记堆栈上的指针已被覆盖的节点下方的实时图可能尚未被标记。

据我了解,GC过程从根开始遍历对象,添加指向辅助堆栈的指针。这很容易。但是,这个堆栈有一个特定的大小(这是为了防止溢出)。当这种情况发生时,向该堆栈添加新指针将大于限制(导致 SO),现有条目将被丢弃,以便为新条目腾出空间。我就是这么理解的。

我的问题是这句话:

因此,堆栈可能在标记过程完成之前变空,因为标记堆栈上的指针已被覆盖的节点下方的实时图可能尚未被标记。

英语不是我的母语,这里讨论的话题并非微不足道,但我只需要一个答案——根据上面的句子,这个机制是如何工作的?为什么堆栈应该被清空,而不是保持恒定 <= h 的条目数量?

PS。在琼斯的第二本书- “垃圾收集手册”中,没有关于上述主题的消息,所以很遗憾我无法比较措辞/表述。

4

1 回答 1

1

我认为这正是你认为它所做的。有一个大小为 3 的堆栈,我在上面写了 A、B、C 和 D。D 覆盖了 A。因此,A 永远不会被查看。

取决于你如何实现有限长度堆栈,在你写 D 之后,堆栈长度可能是 3 也可能是 4。但无论哪种情况,当你回到堆栈长度为 0 时,你仍然没有查看在 A。

于 2021-11-04T22:51:23.103 回答