CMS垃圾回收器——三色標記算法

CMS(current Mark Sweep):顧名思義,這是一個併發,標記、清除的垃圾回收器,適用於老年代垃圾回收。
在jdk1.8中和新生代的ParNew垃圾回收器搭配使用。

CMS垃圾回收器主要過程

在這裏插入圖片描述
整個過程可以大致分爲五個步驟,其中只有初試標記和重新標記需要STW,其他步驟都可以併發執行,可以看出這是一款追求最小停頓時間的垃圾回收器。

concurrent mode failure

併發標記和併發標記處理階段,如果又觸發full GC,會導致出現“concurrent mode failure”,這時會STW並且使用Serial old 垃圾收集器收集,要避免出現這種情況

初始標記

標記GCRoot可以直接引用的對象,不再進行深層次掃描,所以速度很快,STW時間很短。

併發標記

在初始標記的基礎上對整個堆中的對象進行逐層掃描,耗時較長,但是因爲是和用戶程序併發執行,並不影響用戶體驗。
但是併發標記的過程都會有個問題,和應用程序一起執行,應用程序的狀態會發生變化,**可能存在漏標和多標的情況存在,**漏標的問題可以通過重新標記解決,多標的問題會產生“浮動垃圾”,下一次GC時再解決。

重新標記

重新標記的過程可以解決併發標記過程中的漏標問題。主要是通過三色標記的增量更新方法來處理的。
三色:黑色、灰色和白色
**黑色:**對象已經被垃圾收集器掃描過,並且這個對象的所有引用都已經掃描過了,所以它不可能指向白色對象;
**灰色:**對象已經被垃圾收集器掃描過了,但是對象中還存在沒有掃描的引用;
**白色:**表示對象沒有被垃圾收集器訪問過,即表示不可達。

增量更新

這裏的增量指的就是我們在併發標記過程中(三色標記之後)一些新的引用的變化情況。

寫屏障

漏標的原因是併發過程中引用的改變,C++實現垃圾回收器的時候,通過寫屏障將變化的對象引用放入一個隊列中,並最終放到一個集合中,然後再重新標記階段進行再次掃描,因爲重新標記是STW的,所以可以準確標記,解決漏標問題。

CMS主要參數

-XX:UseCMSCOmpactAtFullCOlletion:FullGC之後進行壓縮整理,減少碎片
-XX:CMSFullGcsBeforeCompaction:多少次FullGc之後壓縮一次,默認是0,每次都壓縮
-XX:CMSInitialOccupancyFraction:
-xx:UseCMSInitialOccupancyOnly:
兩個參數表示當老年代達到指定參數時,出發FullGc

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章