CMS前世此生

CMS一直是面試中的常考點,今天咱們用通俗易懂的語言簡單介紹下。java


垃圾回收器爲何要分區分代?


image.png

如上圖:JVM虛擬機將堆內存區域分代了,先生代是朝生夕死的區域,老年代是老不死的區域,不一樣的年代對象有不一樣特性,所以須要不一樣的垃圾收集器去處理。以下圖,黑豎線左邊的區域都是分代垃圾收集器,G1以後內存就不分代了。面試


image.png


單線程垃圾收集器:Serial + Serial Old


Serial(SY),Serial Old(SO)是單線程垃圾收集器組合,垃圾收集線程是單線程的,隨着現代內存區域愈來愈大,SY+SO組合已經愈來愈少了。垃圾收集的單線程須要STW時間無疑越長。這種組合比較合適較早JDK版本。以下圖,用戶線程表示應用程序處理過程,垃圾收集線程表示垃圾線程清理垃圾過程,此階段應用程序是須要等待垃圾線程STW的。算法

image.png

多線程垃圾收集器:PS+PO


前面咱們說了,單線程垃圾收集器缺點就是當內存區域變大,收集效率會很低,那OK,搖身一變,以下圖,多線程垃圾處理器。微信

image.png

值得注意的是:PS+PO組合是JDK1.7,JDK1.8默認垃圾收集器。經過java -XX:+PrintCommandLineFlags命令能夠在Dos界面查看。以下圖,該命令能夠查看JVM初始化的默認參數。好比:-XX:InitialHeapSize表示初始化堆大小。多線程

image.png


爲啥蹦出來個CMS+ParNew


並行處理有了,CMS+ParNew又是幹嗎的?其實PO關注是吞吐量,而CMS關注是縮短STW時間。而CMS處理流程更復雜,至於ParNew,其實約等於PS,若是你注意最上面一個圖,你會發現PS年輕代沒法和CMS組合。因此就多出來了一個ParNew。併發


介紹CMS階段


CMS,全名稱Concurrent Mark Sweep,中文釋義併發標記清除,從名字上能夠看出算法思想使用標記清除算法,下面咱們看看CMS簡化處理流程。ide

image.png

  • 初始標記。只標記GC root可達的第一個節點。會短暫的STW。
  • 併發標記。用戶線程和垃圾線程同時進行。垃圾線程會繼續向下尋找GCroot,不會有STW。但也會有兩個問題。
    • 多標:以前不是垃圾,如今線程出棧引用斷開了變成了垃圾。也稱爲浮動垃圾。
    • 錯標:以前已經被標註是垃圾,但如今從新引用。
  • 從新標記。STW時間通常低於200毫秒。
  • 併發清除。併發清除時,由於用戶線程和垃圾線程一塊兒工做,若是CMS線程異常,可能會觸發SO單線程執行。程序可能會特別緩慢。

劣勢:碎片嚴重。spa


總結


主要簡單介紹了分代垃圾回收器,特別介紹了cms執行過程,G1留下次再說吧。好了,文章有地方還寫的不清晰但願親們加以指正和點評,喜歡的請點贊加關注哦。點關注,不迷路,我是叫練,邊叫邊練,公衆號叫練,微信號【jiaolian123abc】。祝你們生活愉快。線程

相關文章
相關標籤/搜索