如何在堆栈机器中查找gc根



我正在为一台相当标准的堆栈机器编写编译器。现在我想添加一个垃圾收集器。我可以看到,我可以生成某种"堆栈映射"来知道哪些变量是每个激活记录中的gc根。然而,我不知道如何处理在执行过程中推送到堆栈中的中间值。我正在编译的语言类似于Pascal,所以我不需要也不想使用标记来识别其他数据类型的指针。

我将感谢任何关于如何的提示/建议

  1. 在任何时间点在堆栈中查找gc根(即,如何识别在堆栈中推送的中间值中的哪些是gc根)
  2. 对该信息进行编码的常见形式(即,如何生成和编码"堆栈映射")

非常感谢!Nicolas

另一个选项是使用影子堆栈:由您自己维护的引用堆栈。这是迄今为止最容易实现的选项。

一个简单的解决方案是显式存储每个堆栈条目的类型。那么你就不需要堆栈映射了;如果类型是"引用",则该条目是GC根。这种方法对于调试特别方便,因为您可以轻松地显示堆栈的(类型化的)内容。

如果你真的想使用堆栈映射,一个简单的解决方案是生成一个堆栈映射来配合每条指令。要做到这一点,可以在编译时跟踪堆栈内容,或者对编译后的指令进行第二次遍历。然后,在查找GC根时,对于堆栈上的每一帧,都使用当前指令附带的映射。

最新更新