JVM 垃圾回收器

以下是對主流 JVM 垃圾回收器的詳細解析,涵蓋?

一、Serial GC(單線程串行回收器)

二、Parallel GC(吞吐量優先回收器)

三、CMS(Concurrent Mark Sweep,低延遲回收器)

四、G1(Garbage-First,區域分代回收器)

五、ZGC(超低延遲回收器)

六、Shenandoah(OpenJDK 低延遲回收器)

?的核心機制、適用場景及橫向對比,幫助理解不同垃圾回收器的設計哲學與性能特點。

一、Serial GC(單線程串行回收器)

核心機制
  • 算法
    • 新生代:復制算法(Copying Algorithm),將存活對象從 Eden/Survivor 復制到另一塊 Survivor。
    • 老年代:標記 - 整理算法(Mark-Compact),標記存活對象后壓縮內存空間。
  • 執行特點
    • 單線程:GC 時需?Stop The World(STW),暫停所有應用線程,全程由一條 GC 線程完成。
    • 簡單高效:無線程切換開銷,適合內存較小的環境。
關鍵參數
-XX:+UseSerialGC        # 啟用 Serial GC(默認用于 Client 模式)
-XX:SurvivorRatio=8     # Eden:Survivor 比例(默認 8:1)
適用場景
  • 嵌入式設備或?單核心服務器(如小型桌面應用)。
  • 內存 < 1GB?的場景,STW 時間可控。
優缺點
優點缺點
簡單可靠,無額外內存開銷單線程導致 STW 時間較長
適合內存小的場景無法利用多核 CPU 優勢

二、Parallel GC(吞吐量優先回收器)

核心機制
  • 算法
    • 新生代:多線程復制算法,并行執行垃圾回收。
    • 老年代:多線程標記 - 整理算法(JDK 8 前為 Serial Old,JDK 9+ 為 Parallel Old)。
  • 執行特點
    • 多線程并行:通過?-XX:ParallelGCThreads?設置線程數,利用多核 CPU 縮短 STW 時間。
    • 目標吞吐量:通過?-XX:GCTimeRatio?控制 GC 時間占比(默認 99%,即 GC 時間 ≤ 1%)。
關鍵參數
-XX:+UseParallelGC      # 啟用 Parallel GC(默認用于 Server 模式)
-XX:MaxGCPauseMillis=100 # 目標最大停頓時間(毫秒,動態調整堆大小)
-XX:GCTimeRatio=99      # 吞吐量目標(1/(1+N),N=99 即吞吐量 99%)
適用場景
  • 后臺計算任務(如大數據處理、科學計算),優先保證吞吐量。
  • 堆內存中等大小(如 4-8GB),允許較短 STW 但需高持續處理能力。
優缺點
優點缺點
多線程提升吞吐量停頓時間仍隨堆增大而增長
自動調優(自適應策略)無法滿足低延遲需求

三、CMS(Concurrent Mark Sweep,低延遲回收器)

核心機制
  • 算法
    • 標記 - 清除(Mark-Sweep):老年代使用該算法,避免整理內存的 STW 開銷。
    • 分代設計:新生代用 Parallel Scavenge(多線程復制),老年代用 CMS 并發回收。
  • 執行階段(老年代):
    1. 初始標記(STW):標記根對象,耗時短。
    2. 并發標記:與應用線程并行標記可達對象。
    3. 重新標記(STW):修正并發標記期間的變動,耗時短。
    4. 并發清除:與應用線程并行清除垃圾對象。
關鍵參數
-XX:+UseConcMarkSweepGC  # 啟用 CMS GC
-XX:CMSInitiatingOccupancyFraction=70 # 老年代占用 70% 時觸發 GC
-XX:+CMSParallelRemarkEnabled # 啟用并行重新標記(減少 STW 時間)
適用場景
  • 交互式應用(如 Web 服務器、前端服務),需降低 STW 對用戶體驗的影響。
  • 堆內存較大(如 8-16GB),但對象存活率較高(老年代占比大)。
優缺點
優點缺點
老年代并發回收,STW 時間短標記 - 清除導致內存碎片
適合低延遲場景并發階段占用 CPU 資源
分代設計提升回收效率可能觸發 "Concurrent Mode Failure"(回收速度慢于分配速度)

四、G1(Garbage-First,區域分代回收器)

核心機制
  • 分區(Region)設計
    • 將堆劃分為大小相等的 Region(如 2MB-32MB),每個 Region 可動態扮演 Eden、Survivor、Old 或 Humongous(大對象)。
    • 優先回收價值高的區域:通過記錄每個 Region 的垃圾占比,優先處理回收收益最大的區域(Garbage-First 得名)。
  • 算法
    • 新生代:多線程復制算法,回收 Eden/Survivor 區域。
    • 老年代:并發標記 + 混合回收(部分 Old Region + 新生代),基于標記 - 整理算法。
執行階段
  1. 初始標記(STW):標記根對象。
  2. 并發標記:與應用線程并行標記可達對象。
  3. 最終標記(STW):處理 SATB 日志(Snapshot At The Beginning,記錄并發階段新增引用)。
  4. 篩選回收(STW):計算各 Region 回收收益,選擇部分 Old Region 與新生代混合回收。
關鍵參數
-XX:+UseG1GC            # 啟用 G1 GC
-XX:G1HeapRegionSize=4m # 設置 Region 大小(自動推算默認值)
-XX:MaxGCPauseMillis=200 # 目標最大停頓時間(默認 200ms)
-XX:G1MixedGCCountTarget=8 # 混合回收時最大 Region 數
適用場景
  • 大內存(8GB+)?且?需要兼顧吞吐量與低延遲?的場景(如微服務、中間件)。
  • 對象分配頻率高(如新生代大對象多),或存在大量中等大小對象(避免進入 Humongous Region)。
優缺點
優點缺點
分區設計避免內存碎片內存占用高(每個 Region 需元數據)
可預測的停頓時間并發標記階段耗 CPU 資源
混合回收應對老年代回收調優復雜度高于 CMS/Parallel

五、ZGC(超低延遲回收器)

核心機制
  • 著色指針(Colored Pointers)
    • 將對象引用的低 4 位用于存儲 GC 狀態(如標記位、重映射狀態),無需修改對象頭,減少內存訪問開銷。
  • 讀屏障(Load Barrier)
    • 在讀取對象引用時動態修正指針(如對象被移動到新 Region,通過讀屏障獲取新地址)。
  • 并發標記 - 整理
    • 全程幾乎無 STW(僅初始標記和再標記有極短停頓,通常 <1ms),支持 TB 級堆內存。
執行階段
  1. 初始標記(STW):標記根對象,耗時極短。
  2. 并發標記:與應用線程并行標記可達對象。
  3. 再標記(STW):處理并發標記期間的引用變動,耗時極短。
  4. 并發轉移:移動存活對象到新 Region,通過讀屏障修正所有引用。
關鍵參數
-XX:+UseZGC              # 啟用 ZGC(JDK 11+)
-XX:ZHeapMaxSize=8t      # 最大堆內存(支持 TB 級)
-XX:ZCollectionInterval=1000 # 強制 GC 間隔(毫秒,避免碎片累積)
適用場景
  • 超大堆內存(16GB-8TB)且?對延遲敏感?的場景(如金融交易、實時數據處理)。
  • 云原生環境(如 Kubernetes 彈性擴縮容),需快速啟動和低停頓。
優缺點
優點缺點
停頓時間 <10ms,幾乎無感知吞吐量略低于 G1(約 95%)
支持動態堆大小調整僅 JDK 11+ 可用,需謹慎適配
分代設計(JDK 15+)提升年輕代回收效率

六、Shenandoah(OpenJDK 低延遲回收器)

核心機制
  • 轉發指針(Forwarding Pointer)
    • 在對象頭中添加指針,指向對象的新地址(移動后通過該指針修正引用)。
  • 布魯姆過濾器(Bloom Filter)
    • 快速判斷對象是否已被移動,減少無效的指針掃描,提升并發性能。
  • 并發標記 - 復制
    • 與 ZGC 類似,全程并發執行,僅初始標記和最終標記有短暫 STW。
執行階段
  1. 初始標記(STW):標記根對象。
  2. 并發標記:與應用線程并行標記可達對象。
  3. 最終標記(STW):處理漏標的對象,耗時短。
  4. 并發回收:移動存活對象到新 Region,通過轉發指針更新引用。
關鍵參數
-XX:+UseShenandoahGC     # 啟用 Shenandoah(OpenJDK 12+)
-XX:ShenandoahGCMode=主動/被動 # 觸發模式(主動模式基于內存閾值,被動響應分配壓力)
-XX:MaxGCPauseMillis=10  # 目標停頓時間(默認 10ms)
適用場景
  • 大內存(8GB-2TB)且?需要 OpenJDK 原生支持?的場景(如開源項目、非商業環境)。
  • 對吞吐量要求中等,但需嚴格控制延遲的應用(如消息中間件、實時分析系統)。
優缺點
優點缺點
停頓時間與 ZGC 相當吞吐量低于 G1(約 90%)
內存占用低(轉發指針僅占對象頭)商業 JDK 需授權(OpenJDK 免費)
社區活躍,適配性強調優參數較多,需深入理解機制

七、橫向對比表格

維度Serial GCParallel GCCMSG1ZGCShenandoah
設計目標簡單單線程高吞吐量低延遲(老年代)平衡吞吐量與延遲超低延遲(TB 級)超低延遲(OpenJDK)
堆大小推薦小(<1GB)中等(4-8GB)中大(8-16GB)大(8GB+)超大(16GB+)大(8GB-2TB)
STW 時間中等短(老年代并發)可控(<500ms)極短(<10ms)極短(<10ms)
算法核心復制 + 標記整理并行復制 + 整理并發標記 - 清除分區 + 混合回收著色指針 + 并發整理轉發指針 + 并發復制
適用場景嵌入式 / 單核心后臺計算Web 服務微服務 / 中間件金融 / 實時數據開源 / OpenJDK 環境
JDK 版本全版本全版本JDK 1.4+JDK 7+JDK 11+OpenJDK 12+
典型參數-XX:+UseSerialGC-XX:+UseParallelGC-XX:+UseConcMarkSweepGC-XX:+UseG1GC-XX:+UseZGC-XX:+UseShenandoahGC

八、選擇建議

  1. 小內存 / 簡單場景
    • 優先選?Serial GC(單核心)或?Parallel GC(多核、需吞吐量)。
  2. 中等內存 / 低延遲需求
    • 選?CMS(老年代對象多)或?G1(對象分配頻繁、需分代回收)。
  3. 大內存 / 超低延遲
    • 商業場景選?ZGC(JDK 11+,Oracle/OpenJDK);
    • 開源場景選?Shenandoah(OpenJDK 12+,避免授權問題)。
  4. 云原生 / 彈性擴縮容
    • 優先?ZGC(支持動態堆調整和超大內存)。

九、發展趨勢

  • ZGC/Shenandoah 主導未來:逐步替代 G1 成為大內存場景的默認選擇。
  • 分代與并發結合:如 ZGC 支持分代(JDK 15+),提升年輕代回收效率。
  • 硬件協同優化:利用 CPU 特性(如 AMD 的 MMU 分頁)加速 GC 指針操作。

通過理解不同垃圾回收器的設計 trade-off,可根據具體業務需求(吞吐量、延遲、內存大小)選擇最優方案,或通過組合參數(如 G1 的?-XX:InitiatingHeapOccupancyPercent)進一步調優。

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

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

相關文章

從零開始學習three.js(21):一文詳解three.js中的矩陣Matrix和向量Vector

一、三維世界的數學基石 在Three.js的三維世界里&#xff0c;所有視覺效果的實現都建立在嚴密的數學基礎之上。其中向量&#xff08;Vector&#xff09; 和矩陣&#xff08;Matrix&#xff09; 是最核心的數學工具&#xff0c;它們就像構建數字宇宙的原子與分子&#xff0c;支…

ArcGIS Pro 3.4 二次開發 - 內容

環境&#xff1a;ArcGIS Pro SDK 3.4 .NET 8 文章目錄 內容1 工程1.1 創建一個空工程1.2 使用指定名稱創建新工程1.3 使用Pro的默認設置創建新工程1.4 使用自定義模板文件創建新工程1.5 使用 ArcGIS Pro 提供的模板創建工程1.6 打開現有工程1.7 獲取當前工程1.8 獲取當前工程的…

【Python-Day 15】深入探索 Python 字典 (下):常用方法、遍歷、推導式與嵌套實戰

Langchain系列文章目錄 01-玩轉LangChain&#xff1a;從模型調用到Prompt模板與輸出解析的完整指南 02-玩轉 LangChain Memory 模塊&#xff1a;四種記憶類型詳解及應用場景全覆蓋 03-全面掌握 LangChain&#xff1a;從核心鏈條構建到動態任務分配的實戰指南 04-玩轉 LangChai…

31、魔法生物圖鑒——React 19 Web Workers

一、守護神協議&#xff08;核心原理&#xff09; 1. 靈魂分裂術&#xff08;線程架構&#xff09; // 主組件中初始化Workerconst workerRef useRef(null);?useEffect(() > {workerRef.current new Worker(new URL(./creatureWorker.js, import.meta.url));workerRef.…

Spark SQL 之 Antlr grammar 具體分析

src/main/antlr4/org/apache/spark/sql/catalyst/parser/SqlBaseLexer.g4 BACKQUOTED_IDENTIFIER: ` ( ~` | `` )* `;src/main/antlr4/org/apache/spark/sql/catalyst/parser/SqlBaseParser.g4 queryPrimary:

低功耗:XILINX FPGA如何優化功耗?

優化Xilinx FPGA及其外圍電路的功耗需要從硬件設計、軟件配置和系統級優化三個層面綜合考慮。以下是具體的優化策略&#xff0c;涵蓋硬件和軟件方面&#xff1a; 一、硬件層面的功耗優化 選擇低功耗FPGA型號 選擇Xilinx低功耗系列芯片&#xff0c;如7系列中的Artix-7&#xff…

深入理解 ZAB:ZooKeeper 原子廣播協議的工作原理

目錄 ZAB 協議&#xff1a;ZooKeeper 如何做到高可用和強一致&#xff1f;&#x1f512;ZAB 協議的核心目標 &#x1f3af;ZAB 協議的關鍵概念 &#x1f4a1;ZAB 協議的運行階段 &#x1f3ac;階段一&#xff1a;Leader 選舉 (Leader Election) &#x1f5f3;?階段二&#xff…

OpenHarmony外設驅動使用 (五),Fingerprint_auth

OpenHarmony外設驅動使用 &#xff08;五&#xff09; Fingerprint_auth 概述 功能簡介 指紋認證是端側設備不可或缺的功能&#xff0c;為設備提供用戶認證能力&#xff0c;可應用于設備解鎖、支付、應用登錄等身份認證場景。用戶注冊指紋后&#xff0c;指紋認證模塊就可為設…

前端(vue)學習筆記(CLASS 6):路由進階

1、路由的封裝抽離 將之前寫在main.js文件中的路由配置與規則抽離出來&#xff0c;放置在router/index.js文件中&#xff0c;再將其導入回main.js文件中&#xff0c;即可實現路由的封裝抽離 例如 //index.js import { createMemoryHistory, createRouter } from vue-routerim…

前后端交互中的絕對路徑和相對路徑

前端 <form action"hello" method"post"> 1. 不加斜杠 &#xff08;相對路徑&#xff0c;如 action"hello"&#xff09; 解析規則&#xff1a;基于當前頁面的 URL 路徑部分 進行拼接。 假設當前頁面 URL 是 http://域名:端口/應用上下文…

在Odoo 18中創建進度條指南

在Odoo 18中創建進度條指南 一、創建進度條模板 首先在名為 progress_bar_widget.xml 的文件中定義一個名為 ProgressBarWidget 的新模板。該模板使用兩個CSS類&#xff1a;progress-bar-inner 用于樣式化進度條&#xff0c;progress_number 用于顯示進度百分比。您可以根據需…

Linux grep 命令詳解:常用選項、參數及實戰場景

一、grep 命令簡介 grep&#xff08;Global Regular Expression Print&#xff09;是 Linux 中用于文本搜索的核心工具&#xff0c;支持正則表達式&#xff0c;能快速定位文件中的目標內容。 二、常用選項&#xff08;Options&#xff09;及英文對照 | 選項 | 英文全稱 | 作用 …

【Java-EE進階】SpringBoot針對某個IP限流問題

目錄 簡介 1. 使用Guava的RateLimiter實現限流 添加Guava依賴 實現RateLimiter限流邏輯 限流管理類 控制器中應用限流邏輯 2. 使用計數器實現限流 限流管理類 控制器中應用限流邏輯 簡介 針對某個IP進行限流以防止惡意點擊是一種常見的反爬蟲和防止DoS的措施。限流策…

Linux問題排查-找到偷偷寫文件的進程

在 Linux 系統中&#xff0c;若要通過已修改的文件找到修改該文件的進程 PID&#xff0c;可以結合以下方法分析&#xff0c;具體取決于文件是否仍被進程打開或已被刪除但句柄仍存在&#xff1a; 一、文件仍被進程打開&#xff08;未刪除&#xff09; 如果文件當前正在被某個進…

More Effective C++:改善編程與設計(下)

目錄 條款19:了解臨時對象的來源 條款20:協助完成“返回值優化” 條款21:利用重載技術避免隱式類型轉換 條款22:考慮以操作符復合形式&#xff08;op&#xff09;取代其獨身形式&#xff08;op&#xff09; 條款23:考慮使用其他程序庫 條款24:了解virtual functions、mul…

VTK|類似CloudCompare的比例尺實現2-vtk實現

文章目錄 實現類頭文件實現類源文件調用邏輯關鍵問題縮放限制問題投影模式項目git鏈接實現類頭文件 以下是對你提供的 ScaleBarController.h 頭文件添加詳細注釋后的版本,幫助你更清晰地理解每個成員和方法的用途,尤其是在 VTK 中的作用: #ifndef SCALEBARCONTROLLER_H #de…

PostgreSQL 聯合索引生效條件

最近面試的時候&#xff0c;總會遇到一個問題 在 PostgreSQL 中&#xff0c;聯合索引在什么條件下會生效&#xff1f; 特此記錄~ 前置信息 數據庫版本 PostgreSQL 14.13, compiled by Visual C build 1941, 64-bit 建表語句 CREATE TABLE people (id SERIAL PRIMARY KEY,c…

SpringBoot項目里面發起http請求的幾種方法

在Spring Boot項目中發起HTTP請求的方法 在Spring Boot項目中&#xff0c;有幾種常用的方式可以發起HTTP請求&#xff0c;以下是主要的幾種方法&#xff1a; 1. 使用RestTemplate (Spring 5之前的主流方式) // 需要先注入RestTemplate Autowired private RestTemplate restT…

《Python星球日記》 第90天:微調的概念以及如何微調大模型?

名人說:路漫漫其修遠兮,吾將上下而求索。—— 屈原《離騷》 創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder??) 目錄 一、微調原理1. 什么是大模型微調?2. 為什么需要微調?3. 微調的基本流程4. 微調策略分類二、LoRA(Low-Rank Adaptation)技術詳解1. LoRA的核…

機器學習-人與機器生數據的區分模型測試 - 模型融合與檢驗

模型融合 # 先用普通Pipeline訓練 from sklearn.pipeline import Pipeline#from sklearn2pmml.pipeline import PMMLPipeline train_pipe Pipeline([(scaler, StandardScaler()),(ensemble, VotingClassifier(estimators[(rf, RandomForestClassifier(n_estimators200, max_de…