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