CMS收集器和G1收集器 他們的優缺點對比 G1只有併發標記纔不會stop-the-world 其餘都會停下來(阿里屢次問到)

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

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

首先要知道 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停頓,比初始標記稍微長,遠比並發標記短)修正併發標記期間因用戶程序繼續運做而致使標記產生變更的那一部分對象的標記記錄,這個階段的停頓時間通常會比初始標記階段稍長一些,但遠比並發標記時間短post

           4. 併發清理 -清除算法;url

  整個過程當中耗時最長的併發標記和併發清除過程收集器線程均可以與用戶線程一塊兒工做,因此,從整體上來講,CMS收集器的內存回收過程是與用戶線程一塊兒併發執行的。 spa

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

在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具有以下特色:

五、G1運做步驟:

一、初始標記(stop the world事件 CPU停頓只處理垃圾);

二、併發標記(與用戶線程併發執行);

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

四、篩選回收(stop the world事件 根據用戶指望的GC停頓時間回收)(注意:CMS 在這一步不須要stop the world)(阿里問爲什麼停頓時間能夠設置,參考:G1 垃圾收集器架構和如何作到可預測的停頓(阿里)

與其餘GC收集器相比,G1具有以下特色:

一、並行於併發:G1能充分利用CPU、多核環境下的硬件優點,使用多個CPU(CPU或者CPU核心)來縮短stop-The-World停頓時間。部分其餘收集器本來須要停頓Java線程執行的GC動做,G1收集器仍然能夠經過併發的方式讓java程序繼續執行。

二、分代收集:雖然G1能夠不須要其餘收集器配合就能獨立管理整個GC堆,可是仍是保留了分代的概念。它可以採用不一樣的方式去處理新建立的對象和已經存活了一段時間,熬過屢次GC的舊對象以獲取更好的收集效果。

三、空間整合:與CMS的「標記--清理」算法不一樣,G1從總體來看是基於「標記整理」算法實現的收集器;從局部上來看是基於「複製」算法實現的

四、可預測的停頓:這是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——垃圾收集器

相關文章
相關標籤/搜索