1

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

我能想到的方法有两种:

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

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

我目前使用的是第二种方案,因此我在每个函数入口的开头都有一个 GC 检查,以确保足够频繁地执行 GC 检查。

有谁知道我在哪里可以找到有关此主题的更多信息?

4

1 回答 1

1

对于您的问题“有人知道我在哪里可以找到有关此主题的更多信息”,最好的参考是@ Raymond Chen 指出的Paul Wilson 的调查论文。

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

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

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

所以每当分配> = limitForGcInSizeMinor 执行GcMinor(可以停止世界机制或可以并发)。如果分配达到 limitForGcInSizeMajor 则执行 GCMajor(类似于 stop the world )。我划分 GCMinor 和 GCMajor 的主要原因是为了将 GC 峰值(当停止世界机制发生时)的影响减少到最小。

因此,在整个 GC 中,我们遵循 (2) 方式,我的意思是定期以及使用 heap allocation 检查它。Al-tough 我从 CMS 算法中借来了它。

于 2013-02-25T14:55:21.917 回答