深入理解三色標記、CMS、G1垃圾回收器

三色標記算法?

簡介?

????????三色標記算法是一種常見的垃圾收集的標記算法,屬于根可達算法的一個分支,垃圾收集器CMS,G1在標記垃圾過程中就使用該算法

????????三色標記法(Tri-color Marking)是垃圾回收中用于并發標記存活對象的核心算法,通過顏色狀態跟蹤對象可達性,解決并發標記期間因應用線程修改引用導致的漏標多標問題

  1. 白色(White)?:未訪問對象(可能是垃圾)
  2. ?灰色(Grey)?:已訪問對象,但其子引用(成員變量)未被掃描
  3. ?黑色(Black)?:已訪問對象,且其子引用已完全掃描

核心規則

  • 黑色對象不會直接指向白色對象?(否則會漏標)
  • 所有存活對象最終會被標記為黑色,白色對象可安全回收

運行過程

①開始前,所有對象都在白集合中

?②被根對象GC ROOT直接引用的對象變成灰色,放進灰集合中

?③上一步灰色的對象全部變成黑色,進黑色集合中,而灰色的直接引用對象變成灰色進灰集合

④依舊參照上一步?

?⑤直到灰集合中沒有對象,所有的要存活對象都被掃描過了,白色的對象為垃圾會被回收掉?

?多標和漏標問題

????????在并發標記階段,垃圾收集器線程和用戶線程同時運行,此時E,F已經被掃描了,E變成黑色,F變成灰色,但是接下來用戶線程執行了E.F = null,會導致EF之間連線斷開,但是此時F已經變成灰色,但現在實際上F要成為白色的,又不能從灰->白,黑->灰,所以F就是多標了(本應該是垃圾,但是被標記救活了),F就成了浮動垃圾,但是多標問題危害不大,因為下個垃圾回收周期就會把他們清除掉

????????依舊是在并發標記階段,垃圾收集器線程和用戶線程同時運行,此時E,F已經被掃描了,E變成黑色,F變成灰色,但是接下來用戶線程執行F.G = null? ?E.G = G,會導致FG之間連線斷開,而EG之間建立連線,因為黑色對象不能指向白色對象(因為黑色對象的意思就是已經被掃描過,不會再掃描),就會導致G一直是白色最后會被回收掉,但實際上G是有用的對象,所以G就是漏標了(本應該是存活對象,但是沒被標記被回收了),這個漏標的危害就會很高,因為在實際上這個對象還是要用的,就可能會導致空指針NullpointException

漏標問題是如何解決的

首先漏標必須保證兩個必要條件:

? ? ? ? ①至少有一個黑色對象指向白色對象(黑色對象E? ----> 白色對象G?之間有連線)

? ? ? ? ②所有指向該對象的灰色對象都斷開連接(灰色對象 F ----> 白色對象G 之間的連線斷開)

所以CMS和G1就是破壞其中一個條件來解決漏標問題。? ? ??

CMS解決漏標問題---增量更新方案

? ? ? ? 就是把黑色對象指向白色對象 中的黑色對象變成灰色,然后以灰色對象D為根節點,掃描整個引用鏈

G1解決漏標問題---原始快照方案

? ? ? ? ?在并發標記階段,灰色對象對白色對象的連接斷開了,會把白色對象給記錄下來,在最終標記階段,會把白色對象變成灰色,然后再以灰色對象為根節點,去掃描整個引用鏈

CMS(Concurrent Mark-Sweep)

?簡介

CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時間為目標的收集器。它通過并發標記-清除算法,減少應用程序的停頓時間,適合對延遲敏感的應用場景。

在CMS之前的垃圾回收器,要么就是串行垃圾回收方式(Serial GC),要么就是關注系統吞吐量(Parallel Scavenge)。

工作流程

????????①初始標記(STW):標記所有的GC ROOT以及被根對象直接引用的對象

????????②并發標記:垃圾回收器將遍歷對象圖,從GC Roots向下追溯,標記所有可達的對象。這個過程是四個階段中耗時最長的,但是不需要停頓用戶線程,可以與垃圾收集線程一起并發運行。

特點:

????????與應用線程并發執行。

????????可能產生浮動垃圾?(標記期間應用程序新產生的垃圾)

為了解決這個問題,CMS采用了卡表。當應用線程試圖修改老年代的某個對象引用時,把這些發生變化的對象所在的Card標識為Dirty,這樣后續就只需要掃描這些Dirty Card的對象,從而避免掃描整個老年代。

????????③重新標記(STW):修正并發標記期間因應用線程運行導致的對象引用變化,實際上是要掃描整個堆內存的,但是實際上,由于各種優化技術,比如增量更新(Incremental Update)和卡表(Card Table),重新標記階段可以只掃描部分區域。

????????④并發清除:垃圾回收器刪除未被標記的對象,并回收他們占用的內存空間,同樣,該步驟也是與應用線程并發執行的

優缺點分析

? ? ? ? 優點:①低停頓,是以響應時間優先的垃圾回收器

? ? ? ? ? ? ? ? ? ?②適用延遲敏感場景:如實時交易系統、Web服務

? ? ? ?缺點:①使用的是標記-清除算法,會產生內存碎片

? ? ? ? ? ? ? ? ? ②比較消耗CPU資源的,對處理器資源是比較敏感的,在并發階段,它不會導致用戶線程停頓,但會占用一部分線程(或者說處理器的計算能力)來進行垃圾回收,從而導致應用程序變慢,降低總吞吐量。

G1(Garbage First)

?簡介

G1,全名叫:Garbage First。是垃圾收集器技術發展歷史上的里程碑式的成果,從整體來看是基于標記-整理算法實現的收集器,但從局部(兩個Region之間)上看又是基于復制算法實現開創了收集器面向局部收集的設計思路和基于Region的內存布局形式。所以G1相對于CMS的最主要的兩大特點:

? ? ? ? ①基于Region的內存布局

每一個Region都可以扮演不同的角色,并且當一個對象超過0.5個Region大小的時候,就會被判定為大對象,會放到Humorous區域中

? ? ? ? ②可預測的停頓時間模型

G1將Region作為單次回收的最小單元,即每次收集到的內存空間都是Region大小的整數倍

G1收集器會去跟蹤各個Region里面的垃圾堆積的「價值」大小,價值即回收所獲得的空間大小以及回收所需時間的經驗值,然后在后臺維護一個優先級列表

每次根據用戶設定允許的收集停頓時間(-XX:MaxGCPauseMillis指定,默認值是200毫秒),優先處理回收價值收益最大的那些Region,保證了G1收集器在有限的時間內獲取盡可能高的收集效率。

? ? ? ? 并且對于跨Region之間對象引用是通過在每一個Region中維護一個記憶集RSet去存儲對象之間的引用關系

工作流程

????????①初始標記(STW):標記從 GC Roots 直接可達的對象

? ? ? ? ②并發標記:根據引用鏈去標記所有存活對象,使用原始快照方式處理并發期間的對象變化

? ? ? ? ③最終標記(STW):處理 SATB 中的剩余引用,修正標記結果

????????④篩選回收(STW):根據用戶期望的停頓時間來制定回收計劃

優缺點分析

? ? ? ? 優點:①不會產生內存碎片

? ? ? ? ? ? ? ? ? ?②可預測的時間停頓模型

? ? ? ? 缺點:①內存占用,RSet和卡表會占用一定的內存

? ? ? ? ? ? ? ? ? ?②寫屏障開銷,維護 RSet 和卡表引入額外 CPU 開銷。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/71407.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71407.shtml
英文地址,請注明出處:http://en.pswp.cn/web/71407.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

自動駕駛---不依賴地圖的大模型軌跡預測

1 前言 早期傳統自動駕駛方案通常依賴高精地圖(HD Map)提供道路結構、車道線、交通規則等信息,可參考博客《自動駕駛---方案從有圖邁進無圖》,本質上還是存在問題: 數據依賴性高:地圖構建成本昂貴&#xf…

Xshell及Xftp v8.0安裝與使用-生信工具050

官網 https://www.xshell.com/zh/free-for-home-school/ XShell & Xftp 詳解 1. XShell 介紹 1.1 XShell 是什么? XShell 是一款強大的 Windows 終端模擬器,主要用于遠程管理 Linux、Unix 服務器。它支持 SSH、Telnet、Rlogin 及 SFTP 協議&…

跨域-告別CORS煩惱

跨域-告別CORS煩惱 文章目錄 跨域-告別CORS煩惱[toc]1-參考網址2-思路整理1-核心問題2-個人思考3-腦洞打開4-個人思考-修正版1-個人思考2-腦洞打開 3-知識整理1-什么是跨域一、同源策略簡介什么是源什么是同源是否是同源的判斷哪些操作不受同源策略限制跨域如何跨域 二、CORS 簡…

PE文件結構詳解(DOS頭/NT頭/節表/導入表)使用010 Editor手動解析notepad++.exe的PE結構

一:DOS部分 DOS部分分為DOS MZ文件頭和DOS塊,其中DOS MZ頭實際是一個64位的IMAGE_DOS——HEADER結構體。 DOS MZ頭部結構體的內容如下,我們所需要關注的是前面兩個字節(e_magic)和后面四個字節(e_lfanew&a…

Node JS 調用模型Xenova_all-MiniLM-L6-v2實戰

本篇通過將句子數組轉換為句子的向量表示,并通過平均池化和歸一化處理,生成適合機器學習或深度學習任務使用的特征向量為例,演示通過NodeJS 的方式調用Xenova/all-MiniLM-L6-v2 的過程。 關于 all-MiniLM-L6-v2 的介紹,可以參照上…

【C++學習篇】智能指針

目錄 1. 智能指針的使用場景分析 2. RAII和智能指針的設計思路 3. C標準庫智能指針的使用 4.shared_ptr和weak_ptr 4.1shared_ptr的循環引用問題 4.2 weak_ptr 1. 智能指針的使用場景分析 下?程序中我們可以看到,new了以后,我們也delete了&#xff0c…

IntelliJ IDEA集成MarsCode AI

IntelliJ IDEA集成MarsCode AI IDEA中安裝插件 安裝完畢之后登錄自己的賬號 點擊鏈接,注冊賬號 https://www.marscode.cn/events/s/i5DRGqqo/ 可以選擇不同的模型

日期格式與字符串不匹配bug

異常特征:java.lang.IllegalArgumentException: invalid comparison: java.time.LocalDateTime and java.lang.String ### Error updating database. Cause: java.lang.IllegalArgumentException: invalid comparison: java.time.LocalDateTime and java.lang.Str…

C++中的無鎖編程

引言 在當今多核處理器普及的時代,并發編程已成為高性能應用程序開發的關鍵技術。傳統的基于鎖的同步機制雖然使用簡單,但往往會帶來性能瓶頸和死鎖風險。無鎖編程(Lock-Free Programming)作為一種先進的并發編程范式&#xff0c…

FastGPT 引申:借鑒 FastGPT 基于MySQL + ES 實現知識庫(含表結構以及核心代碼)

文章目錄 FastGPT 引申:借鑒 FastGPT 基于MySQL ES 實現知識庫(含表結構以及核心代碼)一、整體思路二、存儲結構2.1 MySQL 表結構(1) knowledge_base_dataset(2) knowledge_base_data(3) knowledge_base_index(4) ai_kb_relation 2.2 Elasti…

Python學習(十四)pandas庫入門手冊

目錄 一、安裝與導入二、核心數據結構2.1 Series 類型(一維數組)2.2 DataFrame 類型(二維數組) 三、數據讀取與寫入3.1 讀取 CSV 和 Excel 文件3.2 寫入數據 四、數據清洗與處理4.1 處理缺失值4.2 數據篩選4.3 數據排序 五、數據分…

【Python 數據結構 4.單向鏈表】

目錄 一、單向鏈表的基本概念 1.單向鏈表的概念 2.單向鏈表的元素插入 元素插入的步驟 3.單向鏈表的元素刪除 元素刪除的步驟 4.單向鏈表的元素查找 元素查找的步驟 5.單向鏈表的元素索引 元素索引的步驟 6.單向鏈表的元素修改 元素修改的步驟 二、Python中的單向鏈表 ?編輯 三…

第1章:項目概述與環境搭建

第1章:項目概述與環境搭建 學習目標 了解YunChangAction靈感記錄應用的整體架構和功能掌握SwiftUI開發環境的配置方法創建項目基礎結構并理解文件組織方式實現應用的啟動屏幕和基本主題設置 理論知識講解 靈感記錄應用概述 靈感記錄應用是一種專門設計用來幫助…

2025.3.3總結

周一這天,我約了績效教練,主要想了解專業類績效的考核方式以及想知道如何拿到一個更好的績效。其他的崗位并不是很清楚,但是專業類的崗位,目前采取絕對考核,管理層和專家崗采取相對考核,有末尾淘汰。 通過…

FastGPT 源碼:基于 LLM 實現 Rerank (含Prompt)

文章目錄 基于 LLM 實現 Rerank函數定義預期輸出實現說明使用建議完整 Prompt 基于 LLM 實現 Rerank 下邊通過設計 Prompt 讓 LLM 實現重排序的功能。 函數定義 class LLMReranker:def __init__(self, llm_client):self.llm llm_clientdef rerank(self, query: str, docume…

LeetCode 1745.分割回文串 IV:動態規劃(用III或II能直接秒)

【LetMeFly】1745.分割回文串 IV:動態規劃(用III或II能直接秒) 力扣題目鏈接:https://leetcode.cn/problems/palindrome-partitioning-iv/ 給你一個字符串 s ,如果可以將它分割成三個 非空 回文子字符串,…

25年3月5日

1.思維導圖 2.不太會 #include "head.h" int main(int argc, const char *argv[]) {int fdopen("../xiaoxin.bmp","O_RDONLY");if(fd-1)printf("open error");//大小struct stat st;if(stat("…

全球首創!微軟發布醫療AI助手,終結手寫病歷時代

今天凌晨,微軟發布了醫療界首個用于臨床工作流程的AI助手Microsoft Dragon Copilot。 Dragon Copilot是基于語音文本的混合架構,能夠將醫生的語音或臨床口述內容實時轉換為文本。例如,醫生可以通過語音輸入患者的病歷信息、醫囑或診斷結果&a…

[自動駕駛-傳感器融合] 多激光雷達的外參標定

文章目錄 引言外參標定原理ICP匹配示例參考文獻 引言 多激光雷達系統通常用于自動駕駛或機器人,每個雷達的位置和姿態不同,需要將它們的數據統一到同一個坐標系下。多激光雷達外參標定的核心目標是通過計算不同雷達坐標系之間的剛性變換關系&#xff08…

Blazor-路由模板(下)

路由約束 類型約束 我們這里使用{id:int}限制路由&#xff0c;id為int類型&#xff0c;并且路由參數 id 對應的 Id 屬性也必須是 int 類型。我們試試能否正常訪問 page "/demoPage/{id:int}" <h3>demoPage</h3> <h2>路由參數Id&#xff1a;Id&l…