2013-02-22 97 views
1

我正在为垃圾收集语言编写一个编译器,并且对我如何知道何时应该运行垃圾回收器感到困惑。何时检查是否需要GC?

有两种方法,我能想到的:

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

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

我现在正在使用第二个方案,因此我在每个函数入口的开头都进行了GC检查,以确保GC检查足够频繁地执行。

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

+4

通常,GC语言中的内存分配是通过简单地增加一个指针来完成的。如果指针增量超过堆的末尾,那么是GC的时间了。如果你想了解GC的实现,[Paul Wilson的调查报告](http://compilers.iecc.com/comparch/article/94-02-143)非常好。 – 2013-02-22 07:56:07

+0

谢谢你的简短而明确的答案。调查报告也非常有帮助。 – 2013-02-22 23:24:02

回答

1

对于你的问题“有人知道我在哪里可以找到关于这个问题的更多信息”,最好的参考是 Paul Wilson's survey paper正如@ Raymond Chen指出的。

为了对现有的垃圾收集算法概述,请检查该link

在你所提到的两种方法(1)和(2),我觉得检查有两种方式来进行。

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

因此,只要分配> = limitForGcInSizeMinor执行GcMinor(可以停止世界机制或可以并发)。如果分配达到limitForGcInSizeMajor,则执行GCMajor(就像停止世界一样)。 我把GCMinor和GCMajor分开的主要原因是为了将GC峰值(当停止世界机制时)的影响降到最低。

因此,在所有的GC中,我们遵循(2)的方式,我的意思是周期性的以及使用堆分配来检查它。 Al-tough我从CMS算法中借用它。

相关问题