CMS收集器和G1收集器的區(qū)別
區(qū)別一: 使用范圍不一樣
CMS收集器是老年代的收集器,可以配合新生代的Serial和ParNew收集器一起使用
G1收集器收集范圍是老年代和新生代田盈。不需要結(jié)合其他收集器使用
區(qū)別二: STW的時(shí)間
CMS收集器以最小的停頓時(shí)間為目標(biāo)的收集器垛吗。
G1收集器可預(yù)測(cè)垃圾回收的停頓時(shí)間(建立可預(yù)測(cè)的停頓時(shí)間模型)
區(qū)別三: 垃圾碎片
CMS收集器是使用“標(biāo)記-清除”算法進(jìn)行的垃圾回收逮壁,容易產(chǎn)生內(nèi)存碎片
G1收集器使用的是“標(biāo)記-整理”算法凌盯,進(jìn)行了空間整合狸剃,降低了內(nèi)存空間碎片掐隐。
區(qū)別四: 垃圾回收的過(guò)程不一樣
CMS回收垃圾的4個(gè)階段
初始標(biāo)記
并發(fā)標(biāo)記
重新標(biāo)記
并發(fā)清理
初始標(biāo)記階段:會(huì)讓線程全部停止,也就是 Stop the World 狀態(tài)
并發(fā)標(biāo)記階段:對(duì)所有的對(duì)象進(jìn)行追蹤钞馁,這個(gè)階段最耗費(fèi)時(shí)虑省。但這個(gè)階段是和系統(tǒng)并發(fā)運(yùn)行的,所以不會(huì)對(duì)系統(tǒng)運(yùn)行造成影響
重新標(biāo)記階段:由于第二階段是并發(fā)執(zhí)行的僧凰,一邊標(biāo)記垃圾對(duì)象探颈,一邊創(chuàng)建新對(duì)象,老對(duì)象會(huì)變成垃圾對(duì)象训措。 所以第三階段也會(huì)進(jìn)入 Stop the World 狀態(tài)伪节,并且重新標(biāo)記,標(biāo)記的是第二階段中變動(dòng)過(guò)的少數(shù)對(duì)象绩鸣,所以運(yùn)行速度很快
并發(fā)清理階段: 這個(gè)階段也是會(huì)耗費(fèi)很多時(shí)間怀大,但由于是并發(fā)運(yùn)行的,所以對(duì)系統(tǒng)不會(huì)造成很大的影響
CMS的總結(jié)和優(yōu)缺點(diǎn)
CMS采用 標(biāo)記-清理 的算法呀闻,標(biāo)記出垃圾對(duì)象化借,清除垃圾對(duì)象。算法是基于老年代執(zhí)行的总珠,因?yàn)樾律a(chǎn)生無(wú)法接受該算法產(chǎn)生的碎片垃圾屏鳍。
優(yōu)點(diǎn):并發(fā)收集勘纯,低停頓
不足:
- 無(wú)法處理浮動(dòng)垃圾,并發(fā)收集會(huì)造成內(nèi)存碎片過(guò)多
- 由于并發(fā)標(biāo)記和并發(fā)清理階段都是并發(fā)執(zhí)行钓瞭,所以會(huì)額外消耗CPU資源
G1回收器的特點(diǎn)
G1的出現(xiàn)就是為了替換jdk1.5種出現(xiàn)的CMS,這一點(diǎn)已經(jīng)在jdk9的時(shí)候?qū)崿F(xiàn)了窜觉,jdk9默認(rèn)使用了G1回收器翅敌,移除了所有CMS相關(guān)的內(nèi)容蠢护。G1和CMS相比必怜,有幾個(gè)特點(diǎn):
- 控制回收垃圾的時(shí)間:這個(gè)是G1的優(yōu)勢(shì),可以控制回收垃圾的時(shí)間鸭丛,還可以建立停頓的時(shí)間模型竞穷,選擇一組合適的Regions作為回收目標(biāo),達(dá)到實(shí)時(shí)收集的目的
- 空間整理:和CMS一樣采用標(biāo)記-清理的算法鳞溉,但是G1不會(huì)產(chǎn)生空間碎片瘾带,這樣就有效的使用了連續(xù)空間,不會(huì)導(dǎo)致連續(xù)空間不足提前造成GC的觸發(fā)
G1把Java內(nèi)存拆分成多等份熟菲,多個(gè)域(Region)看政,邏輯上存在新生代和老年代的概念,但是沒(méi)有嚴(yán)格區(qū)分
貼圖感受一下:
依舊存在新生代老年代的概念抄罕,但是沒(méi)有嚴(yán)格區(qū)分允蚣。Region最多分為2048個(gè)
大對(duì)象的處理
除了上面優(yōu)點(diǎn)之外,還有一個(gè)優(yōu)點(diǎn)呆贿,那就是對(duì)大對(duì)象的處理嚷兔。在CMS內(nèi)存中,如果一個(gè)對(duì)象過(guò)大做入,進(jìn)入S1冒晰、S2區(qū)域的時(shí)候大于改分配的區(qū)域,對(duì)象會(huì)直接進(jìn)入老年代母蛛。G1處理大對(duì)象時(shí)會(huì)判斷對(duì)象是否大于一個(gè)Region大小的50%翩剪,如果大于50%就會(huì)橫跨多個(gè)Region進(jìn)行存放
G1回收垃圾的4個(gè)階段
- 初始標(biāo)記
- 并發(fā)標(biāo)記
- 最終標(biāo)記
- 篩選回收
初始標(biāo)記:標(biāo)記GC Roots 可以直接關(guān)聯(lián)的對(duì)象乳怎,該階段需要線程停頓但是耗時(shí)短
并發(fā)標(biāo)記:尋找存活的對(duì)象彩郊,可以與其他程序并發(fā)執(zhí)行,耗時(shí)較長(zhǎng)
最終標(biāo)記:并發(fā)標(biāo)記期間用戶程序會(huì)導(dǎo)致標(biāo)記記錄產(chǎn)生變動(dòng)(好比一個(gè)阿姨一邊清理垃圾蚪缀,另一個(gè)人一邊扔垃圾)虛擬機(jī)會(huì)將這段時(shí)間的變化記錄在Remembered Set Logs 中秫逝。最終標(biāo)記階段會(huì)向Remembered Set合并并發(fā)標(biāo)記階段的變化。這個(gè)階段需要線程停頓询枚,也可以并發(fā)執(zhí)行
篩選回收:對(duì)每個(gè)Region的回收成本進(jìn)行排序违帆,按照用戶自定義的回收時(shí)間來(lái)制定回收計(jì)劃
什么情況下應(yīng)該考慮使用G1
參考官方文檔:
- 實(shí)時(shí)數(shù)據(jù)占用超過(guò)一半的堆空間
- 對(duì)象分配或者晉升的速度變化大
- 希望消除長(zhǎng)時(shí)間的GC停頓(超過(guò)0.5-1秒)
G1設(shè)置參數(shù)
控制G1回收垃圾的時(shí)間
-XX:MaxGCPauseMillis=200 (默認(rèn)200ms)