GC目前的問題是,會暫停、阻礙代碼的運行,即stop the world。增量式GC處理的就是這個問題。將GC變得可一階段一階段進行。

 

分階段運行的思路并不難,但具體要解決的問題其實是分階段GC后,如何保證下次繼續(xù)時,中斷過程中引用關(guān)系的變化不會對GC造成影響。

 

三色標記法是一個邏輯上的抽象,將對象分成白:未搜索,灰:正搜索,黑:已搜索。

 

在這里,和前面引用計數(shù)中提到的標色不一樣,這里只是一個邏輯概念,在實現(xiàn)中并沒有所謂的black, white。

 

mark_sweep按增量來排,可以分成三個階段:根查找、標記、清除

 

電腦培訓(xùn),計算機培訓(xùn),平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

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)來記錄。}

電腦培訓(xùn),計算機培訓(xùn),平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

 

 

上面這mark,就邏輯上把根對象由白標記為灰了。

 

電腦培訓(xùn),計算機培訓(xùn),平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

i
        
		

網(wǎng)友評論