更多 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 收集器