CMS前世今生
CMS一直是面試中的常考點,今天我們用通俗易懂的語言簡單介紹下。
垃圾回收器為什麼要分區分代?
如上圖:JVM虛擬機將堆記憶體區域分代了,先生代是朝生夕死的區域,老年代是老不死的區域,不同的年代對象有不同特性,因此需要不同的垃圾收集器去處理。如下圖,黑豎線左邊的區域都是分代垃圾收集器,G1之後記憶體就不分代了。
單執行緒垃圾收集器:Serial + Serial Old
Serial(SY),Serial Old(SO)是單執行緒垃圾收集器組合,垃圾收集執行緒是單執行緒的,隨著現代記憶體區域越來越大,SY+SO組合已經越來越少了。垃圾收集的單執行緒需要STW時間無疑越長。這種組合比較合適較早JDK版本。如下圖,用戶執行緒表示應用程式處理過程,垃圾收集執行緒表示垃圾執行緒清理垃圾過程,此階段應用程式是需要等待垃圾執行緒STW的。
多執行緒垃圾收集器:PS+PO
前面我們說了,單執行緒垃圾收集器缺點就是當記憶體區域變大,收集效率會很低,那OK,搖身一變,如下圖,多執行緒垃圾處理器。
值得注意的是:PS+PO組合是JDK1.7,JDK1.8默認垃圾收集器。通過java -XX:+PrintCommandLineFlags命令可以在Dos介面查看。如下圖,該命令可以查看JVM初始化的默認參數。比如:-XX:InitialHeapSize表示初始化堆大小。
為啥蹦出來個CMS+ParNew
並行處理有了,CMS+ParNew又是幹嘛的?其實PO關注是吞吐量,而CMS關注是縮短STW時間。而CMS處理流程更複雜,至於ParNew,其實約等於PS,如果你注意最上面一個圖,你會發現PS年輕代無法和CMS組合。所以就多出來了一個ParNew。
介紹CMS階段
CMS,全名稱Concurrent Mark Sweep,中文釋義並發標記清除,從名字上可以看出演算法思想使用標記清除演算法,下面我們看看CMS簡化處理流程。
- 初始標記。只標記GC root可達的第一個節點。會短暫的STW。
- 並發標記。用戶執行緒和垃圾執行緒同時進行。垃圾執行緒會繼續向下尋找GCroot,不會有STW。但也會有兩個問題。
- 多標:之前不是垃圾,現在執行緒出棧引用斷開了變成了垃圾。也稱為浮動垃圾。
- 錯標:之前已經被標註是垃圾,但現在重新引用。
- 重新標記。STW時間一般低於200毫秒。
- 並發清除。並發清除時,因為用戶執行緒和垃圾執行緒一起工作,如果CMS執行緒異常,可能會觸發SO單執行緒執行。程式可能會特別緩慢。
劣勢:碎片嚴重。
總結
主要簡單介紹了分代垃圾回收器,特別介紹了cms執行過程,G1留下次再說吧。好了,文章有地方還寫的不清晰希望親們加以指正和點評,喜歡的請點贊加關注哦。點關注,不迷路,我是叫練,邊叫邊練,公眾號【叫練】,微訊號【jiaolian123abc】。祝大家生活愉快。