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)記、清除

 

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(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中,由于是用遞歸方式直接深度搜索到底,所以不需要這個(gè)stack,而這個(gè)搜索過程目前會(huì)中斷了,因此需要這樣一個(gè)數(shù)據(jù)結(jié)構(gòu)來(lái)記錄。}

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

 

 

上面這mark,就邏輯上把根對(duì)象由白標(biāo)記為灰了。

 

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

i