我正在为垃圾收集语言编写一个编译器,并且对于我何时应该运行垃圾收集器感到困惑。
我能想到两种方式:
在每次堆分配之前进行GC检查。因此,如果任何分配即将失败,我们将运行GC。
“定期”运行GC检查,并在空间“危险地”低位时执行GC扫描。
我目前正在使用第二种方案,因此我在每个功能条目的开头都进行了GC检查,以确保GC检查的执行频率非常高。
有谁知道我可以在哪里找到有关此主题的更多信息?
答案 0 :(得分: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算法中借用了它。