天天看點

CMS收集器和G1收集器 他們的優缺點對比 G1隻有并發标記才不會stop-the-world 其他都會停下來(阿裡多次問到)

CMS收集算法 參考:圖解 CMS 垃圾回收機制原理,-阿裡面試題

G1收集算法 參考:G1 垃圾收集器入門

首先要知道 Stop the world的含義(網易面試):不管選擇哪種GC算法,stop-the-world都是不可避免的。Stop-the-world意味着從應用中停下來并進入到GC執行過程中去。一旦Stop-the-world發生,除了GC所需的線程外,其他線程都将停止工作,中斷了的線程直到GC任務結束才繼續它們的任務。GC調優通常就是為了改善stop-the-world的時間 

CMS收集器是一種以擷取最短回收停頓時間為目标的收集器,CMS收集器是基于“”标記--清除”(Mark-Sweep)算法實作的,整個過程分為四個步驟:  

          1. 初始标記 (Stop the World事件 CPU停頓, 很短) 初始标記僅标記一下GC Roots能直接關聯到的對象,速度很快;

           2. 并發标記 (收集垃圾跟使用者線程一起執行) 初始标記和重新标記任然需要“stop the world”,并發标記過程就是進行GC Roots Tracing的過程;

           3. 重新标記 (Stop the World事件 CPU停頓,比初始标記稍微長,遠比并發标記短)修正并發标記期間因使用者程式繼續運作而導緻标記産生變動的那一部分對象的标記記錄,這個階段的停頓時間一般會比初始标記階段稍長一些,但遠比并發标記時間短

           4. 并發清理 -清除算法;

  整個過程中耗時最長的并發标記和并發清除過程收集器線程都可以與使用者線程一起工作,是以,從總體上來說,CMS收集器的記憶體回收過程是與使用者線程一起并發執行的。 

初始标記:僅僅是标記一下GC roots 能直接關聯的對象,速度很快  (何為GC roots :

在Java語言中,可作為GC Roots的對象包括4種情況:

  a) 虛拟機棧中引用的對象(棧幀中的本地變量表);

  b) 方法區中類靜态屬性引用的對象;

  c) 方法區中常量引用的對象;

  d) 本地方法棧中JNI(Native方法)引用的對象。

具體參考:JVM的垃圾回收機制 總結(垃圾收集、回收算法、垃圾回收器)) 

CMS是一款優秀的收集器,它的主要優點是:并發收集、低停頓,但他有以下3個明顯的缺點:

優點:并發收集,低停頓 

理由: 由于在整個過程和中最耗時的并發标記和 并發清除過程收集器程式都可以和使用者線程一起工作,是以總體來說,Cms收集器的記憶體回收過程是與使用者線程一起并發執行的

缺點:

   1.CMS收集器對CPU資源非常敏感 

      在并發階段,雖然不會導緻使用者線程停頓,但是會因為占用了一部分線程使應用程式變慢,總吞吐量會降低,為了解決這種情況,虛拟機提供了一種“增量式并發收集器” 

的CMS收集器變種, 就是在并發标記和并發清除的時候讓GC線程和使用者線程交替運作,盡量減少GC 線程獨占資源的時間,這樣整個垃圾收集的過程會變長,但是對使用者程式的影響會減少。(效果不明顯,不推薦) 

  2. CMS處理器無法處理浮動垃圾 

      CMS在并發清理階段線程還在運作, 伴随着程式的運作自然也會産生新的垃圾,這一部分垃圾産生在标記過程之後,CMS無法再當次過程中處理,是以隻有等到下次gc時候在清理掉,這一部分垃圾就稱作“浮動垃圾” , 

 3. CMS是基于“标記--清除”算法實作的,是以在收集結束的時候會有大量的空間碎片産生。空間碎片太多的時候,将會給大對象的配置設定帶來很大的麻煩,往往會出現老年代還有很大的空間剩餘,但是無法找到足夠大的連續空間來配置設定目前對象的,隻能提前觸發 full gc。 

    為了解決這個問題,CMS提供了一個開關參數,用于在CMS頂不住要進行full gc的時候開啟記憶體碎片的合并整理過程,記憶體整理的過程是無法并發的,空間碎片沒有了,但是停頓的時間變長了  

------------------------------------------------------------------------------------------------------------------  

G1(Garbage First)是一款面向服務端應用的垃圾收集器。G1具備如下特點:

5、G1運作步驟:

1、初始标記(stop the world事件 CPU停頓隻處理垃圾);

2、并發标記(與使用者線程并發執行);

3、最終标記(stop the world事件 ,CPU停頓處理垃圾);

4、篩選回收(stop the world事件 根據使用者期望的GC停頓時間回收)(注意:CMS 在這一步不需要stop the world)(阿裡問為何停頓時間可以設定,參考:G1 垃圾收集器架構和如何做到可預測的停頓(阿裡))

與其他GC收集器相比,G1具備如下特點:

1、并行于并發:G1能充分利用CPU、多核環境下的硬體優勢,使用多個CPU(CPU或者CPU核心)來縮短stop-The-World停頓時間。部分其他收集器原本需要停頓Java線程執行的GC動作,G1收集器仍然可以通過并發的方式讓java程式繼續執行。

2、分代收集:雖然G1可以不需要其他收集器配合就能獨立管理整個GC堆,但是還是保留了分代的概念。它能夠采用不同的方式去處理新建立的對象和已經存活了一段時間,熬過多次GC的舊對象以擷取更好的收集效果。

3、空間整合:與CMS的“标記--清理”算法不同,G1從整體來看是基于“标記整理”算法實作的收集器;從局部上來看是基于“複制”算法實作的。

4、可預測的停頓:這是G1相對于CMS的另一個大優勢,降低停頓時間是G1和CMS共同的關注點,但G1除了追求低停頓外,還能建立可預測的停頓時間模型,能讓使用者明确指定在一個長度為M毫秒的時間片段内,

上面幾個步驟的運作過程和CMS有很多相似之處。初始标記階段僅僅隻是标記一下GC Roots能直接關聯到的對象,并且修改TAMS的值,讓下一個階段使用者程式并發運作時,能在正确可用的Region中建立新對象,這一階段需要停頓線程,但是耗時很短,并發标記階段是從GC Root開始對堆中對象進行可達性分析,找出存活的對象,這階段時耗時較長,但可與使用者程式并發執行。而最終标記階段則是為了修正在并發标記期間因使用者程式繼續運作而導緻标記産生變動的那一部分标記記錄,虛拟機将這段時間對象變化記錄線上程Remenbered Set Logs裡面,最終标記階段需要把Remembered Set Logs的資料合并到Remembered Set Logs裡面,最終标記階段需要把Remembered Set Logs的資料合并到Remembered Set中,這一階段需要停頓線程,但是可并行執行。最後在篩選回收階段首先對各個Region的回收價值和成本進行排序,根據使用者所期望的GC停頓時間來制定回收計劃。

參考:CMS收集器和G1收集器優缺點

參考:JVM——垃圾收集器