2010-09-26 53 views
9

移動垃圾收集器(如分代收集器)會產生額外的生成代碼來存儲和重新加載GC安全點上的引用。是否有人量化了與非移動收集器相比這種開銷的性能成本?移動垃圾收集器的成本

我問,因爲我有興趣設計一個收集器,可以有效地回收短期值而無需移動它們。

+0

也嘗試在http://cstheory.stackexchange.com/ – oluies 2010-09-26 22:06:43

+1

他們是否有興趣在那裏的性能測量? – 2010-09-27 10:30:25

回答

6

移動與不移動的折衷是一個複雜的問題。我不知道你提到的方面有什麼特別的研究 - 實際上,我不確定我完全理解它:準確的GC總是需要知道所有指針的位置,所以也許你在談論保守非移動GC?保守的GC在我看來是一個不好的選擇,如果你有足夠的控制編譯路徑能夠做到精確的GC。

影響移動與非移動GC的性能的另一個方面是:

  • 分配速度。非移動GC可能不得不從空閒列表中分配,而GC可以使用緩衝區指針分配。像Immix這樣的混合方案試圖在兩者之間取得更好的折中。

  • 位置和緩存行爲。對於移動GC和非移動GC都有很多研究。請參閱GC Bibliography。一般來說,壓縮對於緩存​​來說是好的,儘管複製GC通常是寬度優先的,這是一個不好的選擇(訪問模式往往是深度優先的),所以有很多研究嘗試重新排列對象以匹配訪問模式。

我個人的意見是,支持真快分配你需要的L2級幼兒園與複製收集和凹凸指針分配。如果你做了其他任何事情,分配會變得更加昂貴,這會導致很多事情發生偏差:優化以減少分配變得更加重要,所以你最終需要在那裏花費精力並使事情變得更加複雜。我寧願讓分配真的很便宜,然後不用擔心。

+0

我明白了,那也是我的印象。我當時正在談論準確(而非保守)的非移動GC,比如HLVM中的GC。它確切地知道所有全局根和堆內指針在哪裏,但是,因爲它們從不移動,所以它可以將它們保存在跨越安全點的寄存器中,並且永遠不必在移動集合之後迭代它們來更新它們。嗯,必須有某種方式來獲得兩全其美的...也許你需要間接地通過全球LUT移動對象的所有引用... – 2010-10-15 12:45:06

+0

@JonHarrop:自從我開始編程「經典」Macintosh以來,雙間接手柄的力量令我印象深刻。我認爲只要有一點硬件支持,這樣的模型可以提供一些很好的優勢(比如能夠有一個高效的垃圾回收器,它不會阻塞任何線程,除非它在被移動時嘗試寫入一個對象,哪種情況下該線程只會在該特定移動完成之前被阻止)。我還認爲大對象應該在4K邊界上對齊,並使用虛擬而不是物理重定位。 – supercat 2013-01-29 16:23:41