编译器构造-何时检查是否需要GC



我正在为垃圾收集语言编写编译器,我对如何知道何时应该运行垃圾收集器感到困惑。

我可以想到两种方法:

  1. 在每次堆分配之前进行GC检查。因此,如果任何分配即将失败,我们将运行GC。

  2. "定期"运行GC检查,并在空间"危险"不足时执行GC扫描。

我目前使用的是第二种方案,因此在每个函数条目的开头都要进行GC检查,以确保GC检查足够频繁。

有人知道我在哪里可以找到更多关于这个主题的信息吗?

对于你的问题"有人知道我在哪里可以找到更多关于这个主题的信息吗",最好的参考是Paul Wilson的调查论文,正如@Raymond Chen所指出的。

要了解现有垃圾收集器算法的概述,请查看此链接

在你提到的(1)和(2)两种方式中,我觉得必须从两种方式进行检查。

假设您已经用某些约束定义了堆。(主约束是size_t maximumSize , base , limit ,NoOfBytesAllocated)。因此,在堆结构中再添加几个字段(如limitForGcInSizeMinor ,limitForGcInSizeMajor limitForGcInObjects)可以更好地解决GC情况(如果您的堆结构已经有了这些字段,请忽略)。

所以每当分配>=limitForGcInSizeMinor执行GcMinor时(可以是停止世界机制,也可以是并发的)。如果分配达到GcInSizeMjor的限制,则执行GCMajor(类似于停止世界)。我将GCMinor和GCMajor分开的主要原因是将GC尖峰(当停止世界机制发生时)的影响降至最低。

所以在GC中,我们一直遵循(2)方式,我指的是周期性的,以及使用堆分配进行检查。我借用了CMS算法。

最新更新