GC目前的問題是,會暫停、阻礙代碼的運行,即stop the world。增量式GC處理的就是這個問題。將GC變得可一階段一階段進行。
分階段運行的思路并不難,但具體要解決的問題其實是分階段GC后,如何保證下次繼續(xù)時,中斷過程中引用關(guān)系的變化不會對GC造成影響。
三色標記法是一個邏輯上的抽象,將對象分成白:未搜索,灰:正搜索,黑:已搜索。
在這里,和前面引用計數(shù)中提到的標色不一樣,這里只是一個邏輯概念,在實現(xiàn)中并沒有所謂的black, white。
mark_sweep按增量來排,可以分成三個階段:根查找、標記、清除
incremental_gc() { case $gc_phase if GC_ROOT_SCAN root_scan_phase() if GC_MARK incremental_mark_phase() else incremental_sweep_phase () } root_scan_phase() { for r : $root mark(r) $gc_phase = GC_MARK } mark(obj) { if !obj.mark obj.mark = true push(obj, $mark_stack) // 理解下,不分段的GC中,由于是用遞歸方式直接深度搜索到底,所以不需要這個stack,而這個搜索過程目前會中斷了,因此需要這樣一個數(shù)據(jù)結(jié)構(gòu)來記錄。}
上面這mark,就邏輯上把根對象由白標記為灰了。
i