如何在堆栈机中查找GC根?

7
我正在编写一个相当标准的堆栈机编译器。现在我想添加垃圾回收器。我可以看到我可以生成某种“堆栈映射”以知道每个激活记录中哪些变量是gc根。然而,我不知道如何处理执行期间推送到堆栈中的中间值。我正在编译的语言类似于Pascal,因此我不需要也不想使用标签来标识指针和其他数据类型。
我会感激任何关于以下内容的提示/指针:
1. 在任何时间点上找到堆栈中的gc根(即如何识别已推送到堆栈中的中间值中的哪些是gc根)。 2. 编码此信息的常见形式(即如何生成和编码“堆栈映射”)。
非常感谢! Nicolas
2个回答

4

另一种选择是使用影子栈:您自己维护的引用栈。这是实现最简单的选项。


2
一个简单的解决方案是显式地存储每个堆栈条目的类型。然后您不需要堆栈映射;如果类型为“引用”,则该条目是GC根。这种方法特别适用于调试,因为您可以轻松显示堆栈的(有类型的)内容。
如果您真的想使用堆栈映射,则一个简单的解决方案是生成与每个指令相对应的堆栈映射。编译时通过跟踪堆栈内容或对编译后的指令进行第二遍扫描来完成此操作。然后,在查找GC根时,对于堆栈上的每个帧,使用与当前指令对应的映射。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接