CMS垃圾收集器和G1垃圾收集器
生活随笔
收集整理的這篇文章主要介紹了
CMS垃圾收集器和G1垃圾收集器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
CMS
CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時間為目標的老年代收集器。CMS收集器與之前的垃圾收集器最大的特點就是它可以并發清除垃圾。
他的工作流程如下:
- 其中初始標記、重新標記這兩個步驟仍然需要“Stop The World”。初始標記僅僅只是標記一下GCRoots能直接關聯到的對象,速度很快;
- 并發標記階段就是從GC Roots的直接關聯對象開始遍歷整個對象圖的過程,這個過程耗時較長但是不需要停頓用戶線程,可以與垃圾收集線程一起并發運行;
- 而重新標記階段則是為了修正并發標記期間,因用戶程序繼續運作而導致標記產生變動的那一部分對象的標記記錄(增量更新),這個階段的停頓時間通常會比初始標記階段稍長一些,但也遠比并發標記階段的時間短;
- 最后是并發清除階段,清理刪除掉標記階段判斷的已經死亡的對象,由于不需要移動存活對象,所以這個階段也是可以與用戶線程同時并發的。由于在整個過程中耗時最長的并發標記和并發清除階段中,垃圾收集器線程都可以與用戶線程一起工作,所以從總體上來說,CMS收集器的內存回收過程是與用戶線程一起并發執行的。
因為CMS垃圾收集器要求低延遲,在清理垃圾的時候要做到并發。所以它采用的是標記-清除算法。 這種算法必然回導致產生大量的空間碎片。
這是他的一個缺點。
他還有兩個缺點就是:
- 對處理器資源非常敏感。
- 無法處理浮動垃圾。
Garbage First(G1)收集器
Garbage First(簡稱G1)收集器是垃圾收集器技術發展歷史上的里程碑式的成果,它開創了收集器面向局部收集的設計思路和基于Region的內存布局形式。
特點:
- 全功能的垃圾收集器(老年代新生代都可使用)
- 把連續的Java堆劃分為多個大小相等的獨立區域(Region),每一個Region都可以根據需要,扮演新生代的Eden空間、Survivor空間,或者老年代空間。
- 垃圾收集的目標范圍并不像其他垃圾收集器一樣要么是整個新生代(Minor GC),要么就是整個老年代(Major GC),再要么就是整個Java堆(Full GC)。它可以面向堆內存任何部分來組成回收集(Collection Set,一般簡稱CSet)進行回收,衡量標準不再是它屬于哪個分代,而是哪塊內存中存放的垃圾數量最多,回收收益最大,這就是G1收集器的Mixed GC模式。
- 能夠支持指定在一個長度為M毫秒的時間片段內,消耗在垃圾收集上的時間大概率不超過N毫秒這樣的目標。
- 讓G1收集器去跟蹤各個Region里面的垃圾堆積的“價值”大小,價值即回收所獲得的空間大小以及回收所需時間的經驗值,然后在后臺維護一個優先級列表,每次根據用戶設定允許的收集停頓時間(使用參數-XXMaxGCPauseMillis指定,默認值是200毫秒),優先處理回收價值收益最大的那些Region。
- 整體用的標記-整理算法,每個region間用的標記-清除算法。
- 它的每個Region都維護有自己的記憶集,來解決跨代引用。
- 而對于那些超過了整個Region容量的超級大對象,將會被存放在N個連續的Humongous Region之中,G1的大多數行為都把Humongous Region作為老年代的一部分來進行看待
工作流程如下:
- 初始標記(Initial Marking):僅僅只是標記一下GC Roots能直接關聯到的對象,并且修改TAMS指針的值,讓下一階段用戶線程并發運行時,能正確地在可用的Region中分配新對象。這個階段需要停頓線程,但耗時很短,而且是借用進行Minor GC的時候同步完成的,所以G1收集器在這個階段實際并沒有額外的停頓。
- 并發標記(Concurrent Marking):從GC Root開始對堆中對象進行可達性分析,遞歸掃描整個堆里的對象圖,找出要回收的對象,這階段耗時較長,但可與用戶程序并發執行。當對象圖掃描完成以后,還要重新處理SATB記錄下的在并發時有引用變動的對象。
- 最終標記(Final Marking):對用戶線程做另一個短暫的暫停,用于處理并發階段結束后仍遺留下來的最后那少量的SATB記錄。(原始快照)
- 篩選回收(Live Data Counting and Evacuation):負責更新Region的統計數據,對各個Region的回收價值和成本進行排序,根據用戶所期望的停頓時間來制定回收計劃,可以自由選擇任意多個Region構成回收集,然后把決定回收的那一部分Region的存活對象復制到空的Region中,再清理掉整個舊Region的全部空間。這里的操作涉及存活對象的移動,是必須暫停用戶線程,由多條收集器線程并行完成的。
G1收集器除了并發標記外,其余階段也是要完全暫停用戶線程的。包括篩選回收。G1不是僅僅面向低延遲,停頓用戶線程能夠最大幅度提高垃圾收集效率,為了保證吞吐量所以才選擇了完全暫停用戶線程的實現方案。
吞吐量 = 執行用戶線程的時間/(執行用戶線程時間 + 執行gc線程時間)。
總結
以上是生活随笔為你收集整理的CMS垃圾收集器和G1垃圾收集器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: requir与include的区别
- 下一篇: paoding 中文分词学习