CMS收集器
全稱:Concurrent Mark Sweep
特點
- 「采用標記-清除算法實現(xiàn)」 2.和Parallel 系列的收集器注重點不同:
Parallel 注重吞吐量CMS注重STW的停頓時間
工作流程
1.初始標記
「CMS inital mark」
?
標記GC Roots直接關(guān)聯(lián)的對象**「需要STW」**
?
2.并發(fā)標記
CMS concurrent mark
?
根據(jù)上一步和GC Roots直接關(guān)聯(lián)的對象進行遍歷整個堆里面的對象圖并進行標記,由于是并發(fā)的所以并 「不需要停頓用戶線程」 ,但是比較耗時因為遍歷整個對象圖。
?
3.重新標記
CMS remark
?
在并發(fā)標記期間由于和用戶線程是并發(fā)的,所以這段期間用戶線程可能更新了引用,所以需要進行一次修正(詳見上一篇文章中講到的 「增量更新」 ) 需要 「STW」 ,STW停頓時間比初始標記時間長,但是并沒有并發(fā)標記運行時間長
?
4.并發(fā)清除
?
清除刪掉被標記為垃圾的對象,由于采用的是標記-清除算法,所以并不需要移動存活對象因此是可以并發(fā)的。(當內(nèi)存碎片嚴重到不足以分配對象時其實還是需要進行標記-整理算法的,這個時候就會提前觸發(fā)FullGC。)
?
「注意」 :在并發(fā)階段產(chǎn)生的**“浮動垃圾”**(并發(fā)時用戶線程產(chǎn)生的垃圾),需要等到下一次垃圾回收才能進行清理;而且并發(fā)的時候需要預留一部分內(nèi)存空間供用戶線程使用,所以不能等到老年代完全用完在進行清理。JDK5的默認設置是當老年代使用了65%的空間就會觸發(fā)GC。
G1 收集器
特點
思維方式的重大轉(zhuǎn)變:
?
G1之前的收集器都是分代收集的思想,根據(jù)不同的代采用不同的GC:新生代(Minor GC),老年代(Major GC),整個JAVA堆(Full GC)。
?
但是GC是根據(jù)哪塊內(nèi)存中垃圾數(shù)量多回收效益最大來區(qū)分的,面向的是堆內(nèi)存中的任意一塊內(nèi)存來組成回收集(Collection Set)進行回收。
實現(xiàn)
?
基于Region的堆內(nèi)存布局來實現(xiàn)該回收過程。不再以固定大小及固定數(shù)量來劃分分代區(qū)域,而是把連續(xù)的堆內(nèi)存區(qū)域進行劃分為各自獨立大小相等的區(qū)域(Region),每一個Region都可以根據(jù)需要扮演新生代中的Enen空間,Survivor空間,或者老年代。收集器根據(jù)扮演不同角色的Region采用不同策略去處理。
?
Region中有一類特殊的Humongous區(qū)域,專門用來存儲大對象。
G1認為一個對象的大小超過了一個Region空間的一半就認為該對象是大對象,如果超過了整個Region空間的超大對象將會被存放在連續(xù)的Humongous Region中,因此該區(qū)域一般會被作為老年代看待。
優(yōu)點
「1.建立可預測的停頓時間模型」 :由于采用的是Region,因此回收單元作為Region即每次回收都是Region大小的整數(shù)倍。
G1會跟蹤Region區(qū)域里面垃圾堆,計算出價值(回收所獲得的空間大小以及回收所需時間的經(jīng)驗值),接著在后臺維護一個優(yōu)先級列表,根據(jù)用戶設置的允許停頓時間來進行回收價值最大的Region區(qū)域。也就是“Garbage First” 的由來。
「2.內(nèi)存碎片」 整體上采用的是標記-整理,但是在兩個Region中實際上還是采用的復制算法,所以不會出現(xiàn)內(nèi)存碎片問題。
缺點
「1.浪費額外內(nèi)存來維護收集器工作」
跨代引用避免全堆掃描之前說過是采用 「記憶集」 的方式來解決,在G1中也一樣。每個Region中都有自己的記憶集 「但是」 在G1中每個Region除了需要記錄別的Region指向自己的指針,還需要標記這些指針分別在哪些卡頁范圍內(nèi)。其實本質(zhì)上說是哈希表,Key是別的Region的起始地址,Value是一個集合存儲的元素是卡表的索引號。因此實現(xiàn)起來比原有的記憶集要復雜,而且Region的數(shù)量比之前的分代數(shù)量要多得多,所以記憶集的維護占用了更高的內(nèi)存
?
G1至少要耗費大約相當于JAVA堆容量的10%到20%來存儲維持收集器正常工作
?
「2.不僅用到寫后屏障還用到了寫前屏障」
上一小點中已經(jīng)講到維護卡表是需要進行添加寫后屏障來完成更新卡表的操作的,但是G1還用到了寫前屏障:由于使用的是原始快照來保證可以進行并發(fā)標記的基礎,對比與增量更新來說雖然能夠減少最終標記的停頓時間,但是相比于收集器,這款收集器不僅采用了寫前屏障也采用了寫后屏障導致最終的效率降低
工作流程
與之前不同的是 「最后一處」 ,這個步驟需要進行 「更新Region的統(tǒng)計數(shù)據(jù),對所有的Region的回收價值和成本進行排序,然后根據(jù)用戶設定的期望停頓時間進行決定選擇哪幾個Region構(gòu)成回收集,然后將一部分的Region中存活對象復制到另外一個空的Region空間中,隨后進行清理掉整個舊的Region空間」 。是不是復制算法(針對與Region來說),因為涉及對象移動,所以需要 「暫停用戶線程」 。
總結(jié)
到此,如果讀者之前閱讀過筆者之前的關(guān)于垃圾回收器講解的文章,其實已經(jīng)對現(xiàn)在大多數(shù)垃圾回收器機制和實現(xiàn)原理了解的差不多了,讀者有興趣可以自行去看Shenandoah收集器和ZGC收集器,本文不在敘述,主要確實文章內(nèi)容有點太長了哈哈。后面的文章將不在分析垃圾回收器的知識,但是還是會更新關(guān)于JVM的文章。
-
GC
+關(guān)注
關(guān)注
0文章
9瀏覽量
17103 -
cms
+關(guān)注
關(guān)注
0文章
60瀏覽量
10998 -
JVM
+關(guān)注
關(guān)注
0文章
158瀏覽量
12261 -
收集器
+關(guān)注
關(guān)注
0文章
30瀏覽量
3189
發(fā)布評論請先 登錄
相關(guān)推薦
固態(tài)硬盤垃圾回收方法
![固態(tài)硬盤<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>方法](https://file.elecfans.com/web2/M00/49/70/poYBAGKhwLSAO8iwAAAU5ZRXEr0941.jpg)
Jvm垃圾回收機制及性能調(diào)優(yōu)實戰(zhàn)
帶顏色的JVM垃圾回收三色標記法
詳解JVM的垃圾回收算法和垃圾回收器
![詳解<b class='flag-5'>JVM</b>的<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>算法和<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b><b class='flag-5'>器</b>](https://file.elecfans.com//web2/M00/3A/34/pYYBAGJCn2GAVUPYAAHiqtKrmaU666.png)
JVM入門之歷代垃圾回收器 1
![<b class='flag-5'>JVM</b><b class='flag-5'>入門</b><b class='flag-5'>之</b><b class='flag-5'>歷代</b><b class='flag-5'>垃圾</b><b class='flag-5'>回收</b><b class='flag-5'>器</b> 1](https://file.elecfans.com/web2/M00/8F/BD/poYBAGPluRyABdAUAAqLqsycUTI954.png)
詳細解析JVM中的垃圾回收機制
垃圾收集器的JVM參數(shù)配置
![<b class='flag-5'>垃圾</b>收集<b class='flag-5'>器</b>的<b class='flag-5'>JVM</b>參數(shù)配置](https://file1.elecfans.com/web2/M00/A7/6D/wKgaomUjux-ANVLUAAChVNUuCZ0773.jpg)
jvm參數(shù)的設置和jvm調(diào)優(yōu)
jvm配置的mx
智能垃圾回收箱控制系統(tǒng)硬件設計
![智能<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>箱控制系統(tǒng)硬件設計](https://file.elecfans.com/web2/M00/40/03/pYYBAGJrSWqAb-nSAAAXmKtCFeo833.jpg)
智能垃圾回收箱功能實驗
![智能<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>箱功能實驗](https://file.elecfans.com/web2/M00/40/03/pYYBAGJrSWqAb-nSAAAXmKtCFeo833.jpg)
從原理聊JVM(一):染色標記和垃圾回收算法
![從原理聊<b class='flag-5'>JVM</b>(一):染色標記和<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>算法](https://file1.elecfans.com//web2/M00/04/71/wKgaombERMKAIkVjAAHROjCUdGM843.png)
評論