JVM 中的 GC 算法演進之路!(Serial、CMS、G1 到 ZGC)

引言

想象一下,Java 程序運行就像在一個巨大的圖書館里借書還書。這個圖書館(JVM 的內存堆區)為了高效運轉,需要一個聰明的“圖書管理員”來清理失效的書籍(垃圾對象)。這,就是垃圾回收器(GC)的使命!


一、什么是 GC?

GC(Garbage Collection)是 JVM 自動內存管理的重要組成部分,負責回收不再被引用的對象所占用的內存空間,防止內存泄露和內存溢出。

1.1 為什么需要 GC?

  • 自動內存管理,減輕開發者負擔
  • 避免野指針、內存泄露等問題
  • 保證 Java 應用穩定高效運行

1.2 GC 面臨的挑戰

  • 如何在不打斷業務的前提下進行垃圾回收?
  • 如何避免過多的 STW(Stop-The-World)?
  • 如何在高并發、大內存場景下依然穩定?

二、JVM 內存結構簡析(理解 GC 的基礎)

JVM 堆區被劃分為以下幾個區域:

  • 新生代(Young Generation):包括 Eden 和兩個 Survivor 區
  • 老年代(Old Generation):存放長生命周期的對象
  • 元空間(Metaspace):替代原有的永久代,存放類的元數據

垃圾回收的重點主要在 新生代和老年代


三、GC 算法簡述

Java GC 的核心算法主要有:

  • 復制算法(Copying):用于新生代
  • 標記-清除(Mark-Sweep):用于老年代
  • 標記-壓縮(Mark-Compact):避免內存碎片
  • 分代收集理論:新生代頻繁回收,老年代少回收

四、GC 發展史:從 Serial 到 ZGC

4.1 Serial GC(串行垃圾回收器)

  • 回收機制:新生代使用復制算法,老年代使用標記-壓縮算法
  • 回收線程:單線程
  • 觸發機制:內存耗盡或觸發 Full GC 時
缺點
  • 每次 GC 都會 Stop-The-World,且只能使用單線程
示例
-XX:+UseSerialGC

📌 適用場景:嵌入式、小型應用、單核處理器


4.2 CMS GC(Concurrent Mark Sweep)

CMS 是第一個低延遲為目標的 GC,著眼于縮短老年代的 GC 停頓時間。

工作流程
初始標記(STW) → 并發標記 → 重新標記(STW) → 并發清除
特點
  • 多線程并發標記和清除,減少 STW
  • 使用 標記-清除 算法,導致內存碎片問題
示例參數
-XX:+UseConcMarkSweepGC
缺點
  • 并發失敗風險:老年代空間不足時需退化為 Serial Old GC
  • 空間碎片影響分配性能

📌 適用場景:中大型系統,對響應時間敏感的 Web 應用


4.3 G1 GC(Garbage First)

G1 GC 是 JDK 9 之后的默認 GC,旨在取代 CMS。

原理
  • 將整個堆劃分為多個大小一致的 Region(既可作為 Eden、Survivor、Old)
  • 基于 Region 的優先級回收策略:優先回收垃圾最多的 Region
  • 并發標記后,通過 Evacuation 將存活對象復制到新的 Region,實現壓縮
回收流程
初始標記(STW) → 并發標記 → 最終標記(STW) → 篩選回收(STW)
特點
  • 支持大堆(數十 GB)
  • 可配置 Pause Time(停頓目標)
  • 減少 Full GC 的頻率
示例參數
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200

📌 適用場景:中大型服務端應用,追求吞吐和響應時間平衡


4.4 ZGC(Z Garbage Collector)

ZGC 是一個為低延遲場景設計的 GC,目標是將所有 GC 停頓控制在 10ms 以內。

特點
  • 幾乎全程并發執行,所有 GC 階段都不長時間阻塞應用線程
  • 使用 染色指針(Colored Pointers) 來標識對象狀態
  • 通過讀屏障和寫屏障實現引用更新的同步
技術亮點
  • 支持極大的堆內存(最高可達 TB 級)
  • 多階段并發整理,移動對象時應用線程無需停止
示例參數
-XX:+UseZGC
-XX:+UnlockExperimentalVMOptions

📌 適用場景:金融、電商、游戲等低延遲業務


五、不同 GC 的對比總結

特性SerialCMSG1ZGC
停頓時間極低
并發回收
內存碎片
吞吐量
響應時間更好極佳
大內存支持一般極好
是否壓縮整理

六、GC 日志分析建議

可以通過以下 JVM 參數輸出 GC 日志:

-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log

常見指標:

  • GC time:單次回收的耗時
  • freed memory:回收掉的內存大小
  • pause time:STW 的具體時間

七、真實案例分析

場景:大數據系統使用 CMS 導致頻繁 Full GC

問題: CMS 回收速度跟不上對象創建速度,頻繁觸發 Full GC,導致延遲劇增。

解決方案: 切換為 G1 GC,并設置合理的 MaxGCPauseMillis,顯著降低了延遲峰值。


八、選擇建議

應用場景推薦 GC
單線程、小型程序Serial
中等延遲要求CMS
大型服務端系統G1
超大堆、極低延遲ZGC / Shenandoah

九、總結與未來展望

JVM 垃圾回收技術不斷進化,從最初的串行單線程到如今幾乎無感知的并發收集器,反映了 Java 在現代應用場景下對性能、可伸縮性和穩定性的持續追求。

未來,ZGC 與 Shenandoah 的持續優化將成為主流趨勢,也許某一天,GC 將真正做到“零成本”!


🔚 尾聲

👍 點贊 + ? 收藏,助你 GC 不迷路!
📬 評論聊聊你在使用 GC 中踩過的坑,或者你的調優秘籍~
📌 關注我,帶你一起玩轉 Java 性能調優!

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

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

相關文章

(9)python+playwright自動化測試-頁面(page)

1.簡介 通過前邊的講解和學習,細心認真地你可能發現在Playwright中,沒有Element這個概念,只有Page的概念,Page不僅僅指的是某個頁面,例如頁面間的跳轉等,還包含了所有元素、事件的概念,所以我們…

《自動控制原理 》- 第 1 章 自動控制的基本原理與方式

1-1 自動控制的基本原理與方式 自動控制是指在沒有人直接參與的情況下,利用外加的設備或裝置,使機器、設備或生產過程的某個工作狀態或參數按照預定的規律運行。自動控制的核心原理是反饋控制,即通過將系統的輸出量回送到輸入端,與…

DL00715-基于YOLOv11的水面漂浮物目標檢測含數據集

【論文必備】基于YOLOv11的水面漂浮物目標檢測——讓你的研究走在科技前沿! 在環境監測、海洋保護和水質管理領域,水面漂浮物的檢測一直是一個亟待解決的難題。傳統的人工巡檢方式不僅耗時費力,還無法覆蓋廣泛的水域范圍。如今,基…

權電阻網絡DAC實現電壓輸出型數模轉換Multisim電路仿真——硬件工程師筆記

目錄 1 基礎知識 1.1 運算放大器在DAC中的作用 1.2 常見的基于運算放大器的DAC電路 1.2.1 倒T形電阻網絡DAC 1.2.2 權電阻網絡DAC 1.2.3 開關電容DAC 1.3 運算放大器的選擇 1.4 設計注意事項 2 仿真實驗 2.1 權電阻網絡DAC實現數字0對應電壓輸出 2.2 權電阻網絡DAC實…

Redis主從集群

? 一、什么是 Redis 主從集群? Redis 主從(Master-Slave)集群是一種最基礎的集群方式: 一臺 Redis 作為主節點(Master),負責寫操作; 一到多臺 Redis 作為從節點(Slave&…

【水印論文閱讀1】將水印規則的定義域從離散的符號空間轉移到連續的語義空間

【水印論文閱讀1】將水印規則的定義域從離散的符號空間轉移到連續的語義空間 寫在最前面**為什么“token序列空間”有根本缺陷?****為什么“語義向量空間”能破局?****1. 連續性(抗攻擊的核心)****2. 高維復雜性(防破解…

Glide緩存機制

一、緩存層級與設計目標 雙級緩存: 內存緩存:弱引用 LruCache 磁盤緩存:DiskLruCache 設計目標: 減少網絡流量消耗 避免Bitmap頻繁創建/銷毀引發的GC 提升圖片加載速度 二、內存緩存機制 1. 雙緩存結構 緩存類型存儲對象…

BaiduSitemap - Typecho站點地圖生成與多搜索引擎推送插件

文章目錄 ?? BaiduSitemap - Typecho站點地圖生成與多搜索引擎推送插件? 功能特點?? 插件架構核心模塊文件結構?? 安裝方法方法一:手動安裝方法二:Git克隆?? 配置說明站點地圖基本設置搜索引擎配置百度搜索引擎必應(Bing)搜索引擎谷歌(Google)搜索引擎?? 使用…

androidx中<layout>根布局的意義及用法

在 Android 開發中,<layout> 根布局是 Android Jetpack Data Binding 庫的核心組件,用于聲明該 XML 布局文件將使用數據綁定功能。以下是詳細說明: ?? 一、基本作用 1. 啟用數據綁定 <layout> 標簽標志著此布局文件支持數據綁定,編譯器會為其生成對應的綁定類…

QTreeWidget 簡單使用

效果圖&#xff1a; 關鍵代碼&#xff1a; void MainProj::_InitTree() { connect(m_pTreeWidget, SIGNAL(itemClicked(QTreeWidgetItem*, int)), this, SLOT(TreeItemClicked(QTreeWidgetItem*, int))); m_pTreeWidget->header()->setHidden(1); /*QTreeWid…

手勢-handpose的pipeline介紹

手勢-handpose的pipeline包括&#xff1a; 1、手部檢測算法&#xff1a;單幀檢測出左右手的邊界框。 2、手部跟蹤算法&#xff1a;連續幀跟蹤&#xff0c;鎖定左右手跟蹤目標&#xff0c;作為后續的手部ui操作。 3、手部關鍵點檢測算法&#xff1a;基于單幀的檢測框圖像作為輸…

計算機操作系統(十七)內存管理

計算機操作系統&#xff08;十七&#xff09;內存管理 前言一、內存的使用與程序重定位&#xff08;一&#xff09;內存是什么&#xff1f;&#xff08;二&#xff09;程序的重定位過程&#xff08;三&#xff09;總結&#xff1a;內存使用的核心問題 二、連續分區管理&#xf…

【編譯原理】期末

單選題 (4分) 令文法G[E]為&#xff1a;E->ET | T T->T*F | F F-> (E) | i 句型 F*iT 的最左素短語是&#xff08; &#xff09; A.F B.i C.T D.F*i B 短語&#xff1a; F*iT、F*i、F、i 素短語&#xff1a; i 最左素短語&#xff1a; i 單選題 (4分) 若在…

一個簡單測試Deepseek吞吐量的腳本,國內環境可跑

一個簡單測試Deepseek吞吐量的腳本,這里用DeepSeek-R1-Distill-Qwen-32B ,支持單卡4090 24G可跑,具體看你的硬件情況做調整,理論支持所有的模型,看你需要,可以修改模型名稱,重點是pip使用國內的源,模型下載用阿里的ModelScope,無障礙下載,使用. 最后可以生成一個txt與html報表.…

前端基礎知識JavaScript系列 - 19(正則表達式)

一、是什么 正則表達式是一種用來匹配字符串的強有力的武器 它的設計思想是用一種描述性的語言定義一個規則&#xff0c;凡是符合規則的字符串&#xff0c;我們就認為它“匹配”了&#xff0c;否則&#xff0c;該字符串就是不合法的 在 JavaScript中&#xff0c;正則表達式也…

Java鎖機制知識點

一、鎖的基礎概念 1.1 什么是鎖 在并發編程中&#xff0c;鎖是用于控制多個線程對共享資源進行訪問的機制。鎖可以保證在同一時刻最多只有一個線程訪問共享資源&#xff0c;從而保證數據的一致性。 1.2 鎖的分類 可重入鎖 vs 不可重入鎖&#xff1a;可重入鎖允許同一個線程…

2025下半年軟考軟件設計師(中級)怎么高效備考,目標是穩過線!

25下半年軟考開始進入備考階段&#xff0c;現在咱們就拋開那些文縐縐的官話&#xff0c;用大白話來聊聊2025下半年軟考軟件設計師&#xff08;中級&#xff09;怎么高效備考&#xff0c;目標是穩過線&#xff01; 核心思想&#xff1a;抓大放小&#xff0c;真題為王&#xff0…

Jupyter常見操作(持續更新)

Jupyter常見操作&#xff08;持續更新&#xff09; 本文主要整理一些常見的或者比較簡單的Jupyter操作&#xff0c;盡量保證一次性整理出來&#xff0c;方便需要但是忘記的情況下可以直接查&#xff0c;希望能當字典。 1.查看Jupyter內核 jupyter kernelspec list 2.使用指定…

連點成畫面積計算算法

連點成畫面積計算算法 問題分析與算法設計 1. 問題特征分析 閉合多邊形(起點和終點相同)線段可能交叉形成復雜形狀需要處理自交多邊形可能有多個內部空洞點數較多(≥50個點),需要高效算法2. 解決方案選擇 采用平面掃描算法結合多邊形布爾運算來準確計算最外層邊界包圍的…

華為云Flexus+DeepSeek征文 | 華為云MaaS平臺上的智能客服Agent開發:多渠道融合應用案例

華為云FlexusDeepSeek征文 | 華為云MaaS平臺上的智能客服Agent開發&#xff1a;多渠道融合應用案例 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 總有一行代碼&#xff0c;能點亮萬千星辰。 &#x1f50d; 在技術的宇宙中&#xff0c;我愿做永不…