溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

垃圾回收CMS的過程是怎樣的

發(fā)布時(shí)間:2021-12-31 17:04:56 來源:億速云 閱讀:482 作者:iii 欄目:編程語言

本篇內(nèi)容主要講解“垃圾回收CMS的過程是怎樣的”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“垃圾回收CMS的過程是怎樣的”吧!

一、CMS介紹

全稱 Concurrent Mark Sweep,是一款并發(fā)的、使用標(biāo)記-清除算法的垃圾回收器。

1、并行,STW時(shí)間短暫。
2、沒有壓縮和整理,產(chǎn)生內(nèi)存碎片。

對(duì)象在標(biāo)記過程中,根據(jù)標(biāo)記情況,分成三類:

1、白色對(duì)象,表示自身未被標(biāo)記;
2、灰色對(duì)象,表示自身被標(biāo)記,但內(nèi)部引用未被處理;
3、黑色對(duì)象,表示自身被標(biāo)記,內(nèi)部引用都被處理;

垃圾回收CMS的過程是怎樣的

觸發(fā)時(shí)間:如果添加了一下參數(shù)

垃圾回收CMS的過程是怎樣的

當(dāng)老年代的使用率達(dá)到80%時(shí),就會(huì)觸發(fā)一次cms gc。

二、CMS的收集過程分為6個(gè)步驟。

假設(shè)CMS GC之前的堆結(jié)構(gòu)如下圖:
垃圾回收CMS的過程是怎樣的

1、初始標(biāo)記(InitialMarking)

這是一個(gè)STW過程,主要分兩步
1、標(biāo)記GC Roots可達(dá)的老年代對(duì)象;
2、遍歷GC Roots下的新生代對(duì)象能夠可達(dá)的老年代對(duì)象;
3、此過程不對(duì)以上可達(dá)的老年代對(duì)象進(jìn)行進(jìn)一步的可達(dá)掃描。

結(jié)果:
垃圾回收CMS的過程是怎樣的

2、并發(fā)標(biāo)記(Marking)

該階段GC線程和應(yīng)用線程并發(fā)執(zhí)行,遍歷InitialMarking階段標(biāo)記出來的存活對(duì)象,然后繼續(xù)遞歸標(biāo)記這些對(duì)象可達(dá)的對(duì)象。
這個(gè)過程應(yīng)用線程在運(yùn)行,可能Young GC也會(huì)發(fā)生,會(huì)發(fā)生以下的情況:
1、新生代對(duì)象晉升到老年代
2、在老年代分配對(duì)象
3、新老年代對(duì)象的引用發(fā)生變化。

結(jié)果:

垃圾回收CMS的過程是怎樣的

2.1、那么如何處理并發(fā)標(biāo)記過程中對(duì)象的變化呢?

CMS使用上一節(jié)講過的Card Table來解決這個(gè)問題
并發(fā)標(biāo)記過程中引用發(fā)生變化的對(duì)象所在的Card,在Card Table來記錄為“臟卡”,這樣在后面重新標(biāo)記的時(shí)候會(huì)把這些對(duì)象也當(dāng)做GC Root來遍歷

但是Young GC如果發(fā)生,比方說:
1、并發(fā)標(biāo)記還未掃描到臟卡1.
2、Young GC掃描完臟卡,并改變dirty到clean.
3、并發(fā)標(biāo)記掃描,發(fā)現(xiàn)卡1已不是臟卡,則不會(huì)處理,這就造成了漏標(biāo)。

2.2、如果解決以上的問題呢?

CMS中,有另一種數(shù)據(jù)結(jié)構(gòu)(Mod Union Table)
Mod Union Table是一個(gè)位向量,每個(gè)單元的大小只有1位,每個(gè)單元對(duì)應(yīng)一個(gè)Card(Card的大小是512字節(jié),Card Table每一個(gè)單元的大小是1個(gè)字節(jié))
在新生代GC處理dirty card之前,先把該card在Mod Union Table里面的對(duì)應(yīng)項(xiàng)置位。
這樣,CMS在執(zhí)行重新標(biāo)記階段的時(shí)候,就會(huì)掃描Mod Union Table和card table里面被標(biāo)記的項(xiàng)。

3、預(yù)清理(Precleaning&AbortablePreclean)

3.1 Precleaning

通過參數(shù)CMSPrecleaningEnabled選擇關(guān)閉該階段,默認(rèn)啟用,主要做兩件事情:

1、處理新生代已經(jīng)發(fā)現(xiàn)的引用,比如在并發(fā)階段,在Eden區(qū)中分配了一個(gè)A對(duì)象,A對(duì)象引用了一個(gè)老年代對(duì)象B(這個(gè)B之前沒有被標(biāo)記),在這個(gè)階段就會(huì)標(biāo)記對(duì)象B為活躍對(duì)象。
2、在并發(fā)標(biāo)記階段,如果老年代中有對(duì)象內(nèi)部引用發(fā)生變化,會(huì)把所在的Card標(biāo)記為Dirty(包括ModUnionTalble),通過掃描這些Table,重新標(biāo)記那些在并發(fā)標(biāo)記階段引用被更新的對(duì)象。

3.2、AbortablePreclean

該階段發(fā)生的前提是,新生代Eden區(qū)的內(nèi)存使用量大于參數(shù)CMSScheduleRemarkEdenSizeThreshold 默認(rèn)是2M,如果新生代的對(duì)象太少,就沒有必要執(zhí)行該階段,直接執(zhí)行重新標(biāo)記階段。

為什么需要這個(gè)階段,存在的價(jià)值是什么?

因?yàn)镃MS GC的終極目標(biāo)是降低垃圾回收時(shí)的暫停時(shí)間,所以在該階段要盡最大的努力去處理那些在并發(fā)階段被應(yīng)用線程更新的老年代對(duì)象,這樣在暫停的重新標(biāo)記階段就可以少處理一些,暫停時(shí)間也會(huì)相應(yīng)的降低。

在該階段,主要循環(huán)的做兩件事:

1、處理 From 和 To 區(qū)的對(duì)象,標(biāo)記可達(dá)的老年代對(duì)象
2、和上一個(gè)階段一樣,掃描處理Dirty Card和ModUnionTalble中的對(duì)象。

當(dāng)然了,這個(gè)邏輯不會(huì)一直循環(huán)下去,打斷這個(gè)循環(huán)的條件有三個(gè):

1、可以設(shè)置最多循環(huán)的次數(shù) CMSMaxAbortablePrecleanLoops,默認(rèn)是0,意思沒有循環(huán)次數(shù)的限制。
2、如果執(zhí)行這個(gè)邏輯的時(shí)間達(dá)到了閾值CMSMaxAbortablePrecleanTime,默認(rèn)是5s,會(huì)退出循環(huán)。
3、如果新生代Eden區(qū)的內(nèi)存使用率達(dá)到了閾值CMSScheduleRemarkEdenPenetration,默認(rèn)50%,會(huì)退出循環(huán)。

4、重新標(biāo)記(STW的過程)

在之前的并行階段,可能產(chǎn)生新的引用關(guān)系如下:

1、老年代的新對(duì)象被GC Roots引用
2、老年代的未標(biāo)記對(duì)象被新生代對(duì)象引用
3、老年代已標(biāo)記的對(duì)象增加新引用指向老年代其它對(duì)象
4、新生代對(duì)象指向老年代引用被刪除

上述對(duì)象中可能有一些已經(jīng)在Precleaning階段和AbortablePreclean階段被處理過,但總存在沒來得及處理的,所以需要做以下事情:

1、遍歷新生代對(duì)象,重新標(biāo)記
2、根據(jù)GC Roots,重新標(biāo)記
3、遍歷老年代的Dirty Card和Mod Union Table,重新標(biāo)記

在第1步驟中,需要遍歷新生代的全部對(duì)象,如果新生代的使用率很高,需要遍歷處理的對(duì)象也很多,這對(duì)于這個(gè)階段的總耗時(shí)來說,是個(gè)災(zāi)難(因?yàn)榭赡艽罅康膶?duì)象是暫時(shí)存活的,而且這些對(duì)象也可能引用大量的老年代對(duì)象,造成很多應(yīng)該回收的老年代對(duì)象而沒有被回收,遍歷遞歸的次數(shù)也增加不少),如果在這之前發(fā)生一次YGC,這樣就可以避免掃描無效的對(duì)象。

CMS算法中提供了一個(gè)參數(shù):CMSScavengeBeforeRemark,默認(rèn)并沒有開啟,如果開啟該參數(shù),在執(zhí)行該階段之前,會(huì)強(qiáng)制觸發(fā)一次YGC,可以減少新生代對(duì)象的遍歷時(shí)間,回收的也更徹底一點(diǎn)。

5、并發(fā)清理

清理在標(biāo)記階段收集標(biāo)識(shí)為不可達(dá)的對(duì)象

6、重置

清除數(shù)據(jù)結(jié)構(gòu),準(zhǔn)備下一次并發(fā)收集。

到此,相信大家對(duì)“垃圾回收CMS的過程是怎樣的”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

cms
AI