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