G1 SATB和Incremental Update算法的理解

著色標(biāo)記

我們都知道cms gc 和g1 gc 的算法都是通過對(duì)gc root 進(jìn)行遍歷,并進(jìn)行三顏色標(biāo)記拯勉,具體標(biāo)記算法如下:

  • 黑色(black):節(jié)點(diǎn)被遍歷完成,而且子節(jié)點(diǎn)都遍歷完成瓶蝴。
  • 灰色(gray): 當(dāng)前正在遍歷的節(jié)點(diǎn)映皆,而且子節(jié)點(diǎn)還沒有遍歷。
  • 白色(white):還沒有遍歷到的節(jié)點(diǎn)凉敲,即灰色節(jié)點(diǎn)的子節(jié)點(diǎn)衣盾。

并行g(shù)c 面對(duì)的共同問題

我們都知道cmg gc 和g1 gc 都是和程序有并行執(zhí)行的階段。既然有并行爷抓,那就有可能在并行運(yùn)行期間之前的標(biāo)記過的對(duì)象的引用關(guān)系可能被改變势决,比如一個(gè)白色對(duì)象從被灰色的引用變?yōu)楸缓谏膶?duì)象引用。如果不做處理蓝撇,那這個(gè)白色的對(duì)象會(huì)被漏掉果复,會(huì)被錯(cuò)誤的回收。會(huì)導(dǎo)致程序錯(cuò)誤唉地。

這也是cms gc 和g1 gc 都有remark階段的原因据悔。都需要重新對(duì)被修改的card 進(jìn)行掃描。

那cms gc 和g1 gc 是怎么解決這個(gè)問題的呢耘沼。而且有什么區(qū)別呢极颓。這就需要了解cms gc 和g1 gc 所用的算法的不一樣而導(dǎo)致不一樣的解決方案了。

cms gc 是Incremental Update算法群嗤,g1 gc 是采用的 stab 算法菠隆,下面我們先講下Incremental Update。

要知道怎么解決問題狂秘,我們先描述下問題的場(chǎng)景骇径,并行g(shù)c 在什么情況下會(huì)出現(xiàn)漏掉活的對(duì)象,根據(jù)三色掃描算法者春,如果有下面兩種情況發(fā)生破衔,則會(huì)出現(xiàn)漏掃描的場(chǎng)景:

  1. 把一個(gè)白對(duì)象的引用存到黑對(duì)象的字段里,如果這個(gè)情況發(fā)生,因?yàn)闃?biāo)記為黑色的對(duì)象認(rèn)為是掃描完成的钱烟,不會(huì)再對(duì)他進(jìn)行掃描晰筛。只能通過灰色的對(duì)象
  2. 某個(gè)白對(duì)象失去了所有能從灰對(duì)象到達(dá)它的引用路徑(直接或間接)

文字描述可能太抽象,通過下面的圖更形象

gc-root.png

如上圖所示拴袭,的對(duì)象D 同時(shí)滿足上面兩個(gè)條件读第,引用存到了黑對(duì)象A上面,同時(shí)切斷了灰對(duì)象B對(duì)它的引用拥刻,那D對(duì)象將被漏掃描了怜瞒。

那CMS GC和G1 GC 是怎么解決這個(gè)問題的呢?

解決這個(gè)問題可以從兩個(gè)角度入手般哼,從上面的圖可以看出吴汪,指向D的這個(gè)引用從源B到目的地址A,所以就有兩種算法分別是從源和目標(biāo)的角度來解決,分別產(chǎn)生了下面兩種算法:

SATB 即 Snapshot-at-beginning

satb 算法認(rèn)為開始標(biāo)記的都認(rèn)為是活的對(duì)象蒸眠,如上圖所示,引用B到D 的引用改為B到C時(shí)浇坐,通過write barrier寫屏障技術(shù),會(huì)把B到D 的引用推到gc 遍歷執(zhí)行的堆棧上黔宛,保證還可以遍歷到D對(duì)象近刘,相對(duì)于d來說,引用從B-->A,SATB 是從源入手解決的臀晃,即上面說的第2種情況觉渴,
這也能理解為啥叫satb 了,即認(rèn)為開始時(shí)所有能遍歷到的對(duì)象都是需要標(biāo)記的徽惋,即都認(rèn)為是活的案淋。如果我吧b = null,那么d 久是垃圾了, satb算法也還是會(huì)把D最終標(biāo)記為黑色险绘,導(dǎo)致D 在本輪gc 不能回收踢京,成了浮動(dòng)垃圾誉碴。

Incremental Update write barrier

Incremental Update 算法判斷如果一個(gè)白色的對(duì)象由一個(gè)黑色的對(duì)象引用,即目的瓣距,如上圖黔帕,D的引用由B-->A,A是目的地址,所以cms 的Incremental Update算法是從目標(biāo)入手解決的蹈丸,這是和SATB的第一個(gè)區(qū)別成黄,發(fā)現(xiàn)這種情況時(shí),也是通過write barrier寫屏障技術(shù)逻杖,把黑色的對(duì)象重新標(biāo)記為灰色奋岁,讓collector 重新來掃描,活著通過mod-union table 來標(biāo)記荸百,cms 就是這樣實(shí)現(xiàn)的闻伶,這是第二個(gè)區(qū)別,做法不一樣够话,也是上面講的防止第一種情況發(fā)生虾攻。

Incremental Update 和 SATB 的區(qū)別。

通過上面的分析更鲁,我們知道SATB write barrier 是認(rèn)為開始標(biāo)記那一刻認(rèn)為都是活的霎箍,所以有可能有些已經(jīng)是垃圾的對(duì)象就會(huì)也被掃描,導(dǎo)致 satb 相對(duì) Incremental Update 會(huì)更多的開銷澡为,g1 gc 掃描的都是選定的固定個(gè)數(shù)的region漂坏,所以這個(gè)開銷應(yīng)該可控,但是而且浮動(dòng)垃圾也更多媒至。

還有個(gè)問題是顶别,為什么G1 GC 選擇用satb 算法,也還沒有想明白拒啰。

以上是通過仔細(xì)閱讀論文和R大的網(wǎng)上的解答得到的總結(jié)和自己的理解驯绎。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市谋旦,隨后出現(xiàn)的幾起案子剩失,更是在濱河造成了極大的恐慌,老刑警劉巖册着,帶你破解...
    沈念sama閱讀 222,865評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拴孤,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡甲捏,警方通過查閱死者的電腦和手機(jī)演熟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來司顿,“玉大人芒粹,你說我怎么就攤上這事兄纺。” “怎么了化漆?”我有些...
    開封第一講書人閱讀 169,631評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵估脆,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我获三,道長(zhǎng)旁蔼,這世上最難降的妖魔是什么锨苏? 我笑而不...
    開封第一講書人閱讀 60,199評(píng)論 1 300
  • 正文 為了忘掉前任疙教,我火速辦了婚禮,結(jié)果婚禮上伞租,老公的妹妹穿的比我還像新娘贞谓。我一直安慰自己,他們只是感情好葵诈,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評(píng)論 6 398
  • 文/花漫 我一把揭開白布裸弦。 她就那樣靜靜地躺著,像睡著了一般作喘。 火紅的嫁衣襯著肌膚如雪理疙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,793評(píng)論 1 314
  • 那天泞坦,我揣著相機(jī)與錄音窖贤,去河邊找鬼。 笑死贰锁,一個(gè)胖子當(dāng)著我的面吹牛赃梧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播豌熄,決...
    沈念sama閱讀 41,221評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼授嘀,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了锣险?” 一聲冷哼從身側(cè)響起蹄皱,我...
    開封第一講書人閱讀 40,174評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎芯肤,沒想到半個(gè)月后夯接,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,699評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纷妆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評(píng)論 3 343
  • 正文 我和宋清朗相戀三年盔几,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掩幢。...
    茶點(diǎn)故事閱讀 40,918評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡逊拍,死狀恐怖上鞠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情芯丧,我是刑警寧澤芍阎,帶...
    沈念sama閱讀 36,573評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站缨恒,受9級(jí)特大地震影響谴咸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜骗露,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評(píng)論 3 336
  • 文/蒙蒙 一岭佳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧萧锉,春花似錦珊随、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至禀崖,卻和暖如春衩辟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背波附。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工艺晴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叶雹。 一個(gè)月前我還...
    沈念sama閱讀 49,364評(píng)論 3 379
  • 正文 我出身青樓财饥,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親折晦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子钥星,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容