2013-02-22 98 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算法中借用它。

相關問題