2011-06-23 48 views
9

我知道停止世界,增量,並行,併發,(軟/硬)實時垃圾收集器的概念。但我無法理解大部分併發的 GC。與併發GC不同嗎?有什麼不同?爲什麼它叫居多什麼是'大多數併發垃圾收集器'?

回答

7

我知道停止世界,增量,並行,併發,(軟/硬)實時垃圾收集器的概念。但我無法理解大多數併發的GC。與併發GC不同嗎?有什麼不同?爲什麼它被稱爲主要?

像許多其他主題一樣,垃圾收集籠罩在術語模糊的霧中。伯姆以非常規方式使用傳統術語尤其臭名昭着,但我們應該原諒他,因爲他在傳統意義尚未僵化的時代開創了這一領域! :-)

據我所知,stop-the-world GC指的是在整個GC循環週期中暫停所有增變器線程的算法,例如,標記整個堆時。例如,.NET Server GC執行此操作並因此導致300ms的停頓時間。增量GC在每個小GC週期執行一點主GC工作,例如, OCaml GC中的「主要切片」。並行意味着GC使用多個線程來加速收集垃圾的過程。同時的GC意味着GC與增變器同時運行,例如, .NET工作站GC。實時很難定義,最初意味着有限的最大暫停時間,但現在也意味着最小的增變器利用率(MMU),以避免GC永遠不會暫停增變器而永遠不允許其運行的GC的病態問題!根據理查德瓊斯的新書,一個即時GC從不會暫停一個以上的增變器(即沒有停止世界的階段),儘管我懷疑他的意思是增變器彼此獨立地被暫停。最後,大多數併發GC是同時掛起所有增變線程的GC,但只能在短時間內暫停,而不能用於任意長的GC週期。因此,允許mutators在GC運行時大部分時間自由運行,因此它被稱爲「基本併發」GC。

「大多數併發」的分類非常重要,因爲大多數(所有?)主要GC都屬於這一類,因爲它提供了暫停時間和吞吐量之間的良好折衷。例如,.NET工作站GC在拍攝全局根的快照時掛起所有的增變線程,但在標記和掃描時恢復它們。

2

您可以在Bohem,Demers和Shenker的文章"Mostly Parallel Garbage Collection"(Proceedings of the ACM SIGPLAN '91 Conference on Programming Language Design and Implementation,SIGPLAN Notices 26,6(1991年6月),第157頁-164)。

他們寫道:

假設我們能夠保持一組虛擬髒位,這是 每當虛擬內存 的相應頁面寫入自動設置的。 (通過對頁面進行寫保護並捕獲得到的寫入 錯誤,可以接受的此功能的實現可以是 ,而不需要修改底層的操作系統內核;在操作系統內核中執行 當然會更有效。) 爲停止世界操作而定義的任何追蹤收集器, 考慮以下收集算法。在 集合的開頭,清除所有虛擬髒位。與mutator並行執行傳統的 跟蹤操作。虛擬髒位 將被更新以反映增變器寫入。完成跟蹤 後,停止世界並跟蹤位於 髒頁上的所有標記對象。 (寄存器被認爲是髒的。)在這一點上,所有可訪問的對象都被標記,垃圾可以安全地回收。

...

在該算法中,平行跟蹤相位提供 近似真正到達集。這個平行跟蹤過程中沒有標記的唯一對象確實可以訪問,必須是 ,這些對象可以從跟蹤的 以後寫入的標記對象中獲得。來自所有這些對象的停止世界追蹤階段跟蹤,因此最終沒有真正可達的對象保持未標記。

當它們是指tracing garbage collectors,它們指的是從命名爲「根節點」(通常該程序的寄存器)開始,並按照指針每個可到達的對象收集器。無法訪問的東西是垃圾。

簡而言之,大多數並行收集器並行執行大量工作,然後暫停程序的執行,以糾正程序在收集器運行時所做的任何更改。因此,它「大部分是平行的」。