@coffeebeansyy 降低停頓時間是一個很籠統(tǒng)的大概念雳攘,G1很多手段都是為了降低STW時間税朴,比如引入了空間置換時間的 RSet,SATB本身解法也算是一種思路,區(qū)別于CMS增量 write barrier。CMS為了維持對象圖變化才引入了post-write barrier 記錄新引用關(guān)系的變化,這個維護(hù)成本很大虑粥,并且致命問題是,無法持續(xù)跟蹤堆外根集變化宪哩,這樣一來娩贷,remark階段就需要重新掃描整個 GC Roots,新生代以及寄存器斋射,too expensive育勺,在處理大堆的時候很可能嚴(yán)重影響停頓時間但荤;SATB跟CMS 增量barrier完全是另一套思路罗岖,關(guān)注的是引用關(guān)系的刪除,使用的是pre-write barrier腹躁,在刪除/變更 引用關(guān)系之前把舊值(old value)記錄下來桑包,對于在并發(fā)標(biāo)記期間刪除/變更的引用關(guān)系的舊值會記錄下來,并且讓引用指向的對象存活過此次GC纺非,即使這個對象有可能并非存活哑了,也只是多了些float garbage而已赘方,在remark階段也不需要重新掃描所有GC roots了,因為只要是新生成的對象弱左,都視為alive窄陡。雖然兩者remark階段同為STW,但是實質(zhì)上處理的事情和延時可能會有本質(zhì)的區(qū)別拆火,尤其是面對大堆的時候跳夭。
G1垃圾收集器之SATB簡書 占小狼轉(zhuǎn)載請注明原創(chuàng)出處,謝謝们镜! openjdk下載 傳送門 對象漏標(biāo) 垃圾回收的并發(fā)標(biāo)記階段币叹,gc線程和應(yīng)用線程是并發(fā)執(zhí)行的,所以一個對象被標(biāo)記之后模狭,應(yīng)用線程可能篡改...