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