如何在堆栈机器中找到gc root?

时间:2013-07-02 19:49:41

标签: compiler-construction garbage-collection code-generation stack-machine gc-roots

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

我很感激有关如何

的任何提示/指示
  1. 在任何时间点在堆栈中查找gc根(即,如何识别已在堆栈中推送的哪些中间值是gc根)。
  2. 编码此信息的常用形式(即,如何生成和编码'堆栈图')
  3. 非常感谢! 尼古拉斯

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

如果你真的想使用堆栈映射,一个简单的解决方案就是生成一个堆栈映射以与每条指令一起使用。您可以通过在编译时跟踪堆栈内容,或者通过对编译指令进行第二次传递来完成此操作。然后,当查找GC根时,对于堆栈中的每个帧,使用与当前指令一起使用的映射。