中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2021-12-31 17:04:56 來源:億速云 閱讀:494 作者:iii 欄目:編程語言

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

一、CMS介紹

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

1、并行,STW時間短暫。
2、沒有壓縮和整理,產生內存碎片。

對象在標記過程中,根據標記情況,分成三類:

1、白色對象,表示自身未被標記;
2、灰色對象,表示自身被標記,但內部引用未被處理;
3、黑色對象,表示自身被標記,內部引用都被處理;

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

觸發時間:如果添加了一下參數

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

當老年代的使用率達到80%時,就會觸發一次cms gc。

二、CMS的收集過程分為6個步驟。

假設CMS GC之前的堆結構如下圖:
垃圾回收CMS的過程是怎樣的

1、初始標記(InitialMarking)

這是一個STW過程,主要分兩步
1、標記GC Roots可達的老年代對象;
2、遍歷GC Roots下的新生代對象能夠可達的老年代對象;
3、此過程不對以上可達的老年代對象進行進一步的可達掃描。

結果:
垃圾回收CMS的過程是怎樣的

2、并發標記(Marking)

該階段GC線程和應用線程并發執行,遍歷InitialMarking階段標記出來的存活對象,然后繼續遞歸標記這些對象可達的對象。
這個過程應用線程在運行,可能Young GC也會發生,會發生以下的情況:
1、新生代對象晉升到老年代
2、在老年代分配對象
3、新老年代對象的引用發生變化。

結果:

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

2.1、那么如何處理并發標記過程中對象的變化呢?

CMS使用上一節講過的Card Table來解決這個問題
并發標記過程中引用發生變化的對象所在的Card,在Card Table來記錄為“臟卡”,這樣在后面重新標記的時候會把這些對象也當做GC Root來遍歷

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

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

CMS中,有另一種數據結構(Mod Union Table)
Mod Union Table是一個位向量,每個單元的大小只有1位,每個單元對應一個Card(Card的大小是512字節,Card Table每一個單元的大小是1個字節)
在新生代GC處理dirty card之前,先把該card在Mod Union Table里面的對應項置位。
這樣,CMS在執行重新標記階段的時候,就會掃描Mod Union Table和card table里面被標記的項。

3、預清理(Precleaning&AbortablePreclean)

3.1 Precleaning

通過參數CMSPrecleaningEnabled選擇關閉該階段,默認啟用,主要做兩件事情:

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

3.2、AbortablePreclean

該階段發生的前提是,新生代Eden區的內存使用量大于參數CMSScheduleRemarkEdenSizeThreshold 默認是2M,如果新生代的對象太少,就沒有必要執行該階段,直接執行重新標記階段。

為什么需要這個階段,存在的價值是什么?

因為CMS GC的終極目標是降低垃圾回收時的暫停時間,所以在該階段要盡最大的努力去處理那些在并發階段被應用線程更新的老年代對象,這樣在暫停的重新標記階段就可以少處理一些,暫停時間也會相應的降低。

在該階段,主要循環的做兩件事:

1、處理 From 和 To 區的對象,標記可達的老年代對象
2、和上一個階段一樣,掃描處理Dirty Card和ModUnionTalble中的對象。

當然了,這個邏輯不會一直循環下去,打斷這個循環的條件有三個:

1、可以設置最多循環的次數 CMSMaxAbortablePrecleanLoops,默認是0,意思沒有循環次數的限制。
2、如果執行這個邏輯的時間達到了閾值CMSMaxAbortablePrecleanTime,默認是5s,會退出循環。
3、如果新生代Eden區的內存使用率達到了閾值CMSScheduleRemarkEdenPenetration,默認50%,會退出循環。

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

在之前的并行階段,可能產生新的引用關系如下:

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

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

1、遍歷新生代對象,重新標記
2、根據GC Roots,重新標記
3、遍歷老年代的Dirty Card和Mod Union Table,重新標記

在第1步驟中,需要遍歷新生代的全部對象,如果新生代的使用率很高,需要遍歷處理的對象也很多,這對于這個階段的總耗時來說,是個災難(因為可能大量的對象是暫時存活的,而且這些對象也可能引用大量的老年代對象,造成很多應該回收的老年代對象而沒有被回收,遍歷遞歸的次數也增加不少),如果在這之前發生一次YGC,這樣就可以避免掃描無效的對象。

CMS算法中提供了一個參數:CMSScavengeBeforeRemark,默認并沒有開啟,如果開啟該參數,在執行該階段之前,會強制觸發一次YGC,可以減少新生代對象的遍歷時間,回收的也更徹底一點。

5、并發清理

清理在標記階段收集標識為不可達的對象

6、重置

清除數據結構,準備下一次并發收集。

到此,相信大家對“垃圾回收CMS的過程是怎樣的”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

cms
AI

梧州市| 射阳县| 明光市| 庐江县| 丰镇市| 靖边县| 台山市| 天气| 夏邑县| 广南县| 友谊县| 宾川县| 汾阳市| 巩义市| 西昌市| 固阳县| 双鸭山市| 西安市| 江源县| 启东市| 丹棱县| 石泉县| 福贡县| 遂溪县| 内乡县| 醴陵市| 曲沃县| 镇安县| 星座| 澳门| 隆回县| 凭祥市| 江都市| 谢通门县| 苍溪县| 永修县| 台南县| 隆安县| 淳安县| 巫山县| 昌江|