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——垃圾收集器


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM