Java 并行垃圾回收 CMS算法

更多 Java 虛擬機(jī)方面的文章,請參見文集《Java 虛擬機(jī)》


CMS - Concurrent Mark - Sweep 并行標(biāo)記清除算法

設(shè)置: XX:+UseConcMarkSweepGC
特點(diǎn):以犧牲吞吐量為代價(jià)來獲得更短暫的回收停頓(STW)時(shí)間
適用于:要求服務(wù)響應(yīng)速度的應(yīng)用,比如 Web 應(yīng)用

缺點(diǎn):

  • CMS 不會(huì)整理壓縮堆空間,存在碎片。
  • 需要更多 CPU 資源:CMS 默認(rèn)啟動(dòng)的回收線程數(shù)是(CPU 數(shù)量+3)/ 4,也就是當(dāng) CPU 在4個(gè)以上時(shí),并發(fā)回收時(shí)垃圾收集線程不少于 25% 的 CPU 資源,并且隨著 CPU 數(shù)量的增加而下降。但是當(dāng) CPU 不足4個(gè)(譬如2個(gè))時(shí),CMS 對用戶程序的影響就可能變得很大。
  • 需要更多堆空間:由于在 GC 階段用戶線程還需要運(yùn)行,那也就還需要預(yù)留有足夠的內(nèi)存空間給用戶線程使用。

步驟:

  • 初始標(biāo)記:此階段 STW。GC 進(jìn)程從 GC Roots 開始掃描,且只掃描跟 GC Roots 直接關(guān)聯(lián)的對象,進(jìn)行標(biāo)記。速度很快。
  • 并發(fā)標(biāo)記:此階段 GC 進(jìn)程和用戶進(jìn)程同時(shí)進(jìn)行,不會(huì) STW。GC 進(jìn)程在初始標(biāo)記的基礎(chǔ)上繼續(xù)向下層掃描,進(jìn)行標(biāo)記。
  • 并發(fā)預(yù)處理:此階段 GC 進(jìn)程和用戶進(jìn)程同時(shí)進(jìn)行,不會(huì) STW。GC 進(jìn)程掃描老年代的對象。
  • 重新標(biāo)記:此階段 STW。修正并發(fā)標(biāo)記期間因用戶程序繼續(xù)運(yùn)作而導(dǎo)致標(biāo)記產(chǎn)生變動(dòng)的那一部分對象的標(biāo)記記錄。
  • 并發(fā)清理:此階段 GC 進(jìn)程和用戶進(jìn)程同時(shí)進(jìn)行,不會(huì) STW。不再被應(yīng)用的對象將從堆里清除掉。
  • 并發(fā)重置:此階段 GC 進(jìn)程和用戶進(jìn)程同時(shí)進(jìn)行,不會(huì) STW。收集器做一些收尾的工作,以便下一次 GC 周期能有一個(gè)干凈的狀態(tài)。

引用:
CMS 收集器

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容