CMS(Concurrent Mark Sweep) 並發收集,低停頓,適合響應時間敏感的應用使用。
- 初始標記 Initial mark:標記 GC Roots 能夠關聯到的對象。stop-the-world。
- 並發標記 Concurrent mark:GC Roots tracing,此時業務線程仍在運行。
- 重新標記 remark:重新標記處理並發標記過程中因為用戶程序同時運行而導致標記產生變動的對象的標記記錄。stop-the-world。
- 並發清除 Concurrent sweep:清除無用對象。
初始標記和重新標記占用時間比較短。
缺點:
- 並發階段占用cpu資源,拖慢用戶程序,降低吞吐量,CMS默認啟用(CPU + 3)/4個線程執行。
- 無法處理浮動垃圾(Floating Gorbage),並發清理階段用戶程序產生的垃圾,成為浮動垃圾,無法被當次處理。為了預留用戶程序運行使用內存,CMS需在老年代一定比例時就進行收集,通過-XX:CMSInitiatingOccupancyFraction設置老年代觸發CMS的堆內存使用比例。
- 基於標記---清除算法的CMS,會使老年代產生很多空間碎片,不利於大對象的使用,使用-UseCMSCompactAtFullCollection(默認true)來設置在CMS頂不住將要進行Full GC時進行碎片壓縮整理,此設置會造成停頓,同時可以設置-XX:CMSFullGCsBeforeCompaction(默認0,即每次Full GC都進行碎片整理)來設置執行碎片整理的間隔Full GC次數,即,執行多少次不壓縮的Full GC后,執行一次帶壓縮整理的Full GC。