当前位置: 首页 > news >正文

拆解 CMS/G1/ZGC 三种垃圾回收器算法过程

🔍 一、CMS(Concurrent Mark Sweep)垃圾收集器

✅ 目标:

低延迟(Low Pause),适合对响应时间要求高的应用(如 Web 服务)

⚙️ 使用的算法:

  • 新生代:复制算法

  • 老年代:标记 - 清除算法


🔁 GC 执行过程:

阶段类型说明
1. 初始标记(Initial Mark)STW标记 GC Roots 直接可达对象,速度快
2. 并发标记(Concurrent Mark)并发跟踪 GC Roots 的引用链,找出存活对象
3. 预清理(Preclean)并发处理 Minor GC 期间产生的对象变化
4. 重新标记(Remark)STW再次暂停,修正并发标记阶段遗漏的数据
5. 并发清除(Concurrent Sweep)并发清理不可达对象,释放内存
6. 重置(Reset)并发重新准备数据结构


⚠️ 缺点:

  • 无法整理内存,可能出现碎片

  • 需要暂停两次(Initial Mark 和 Remark)

  • 线程并发期间,会影响吞吐量


面试答题:

CMS 是一种以低停顿为目标的垃圾收集器,采用标记-清除算法进行老年代回收。它通过初始标记、并发标记、重新标记和并发清除阶段完成回收,优点是大部分时间与应用线程并发运行,适合对响应延迟敏感的系统。但缺点是内存碎片问题严重,容易导致 Full GC 频繁发生。


🧩 二、G1(Garbage First)垃圾收集器

✅ 目标:

高吞吐 + 可预测低延迟,JDK 9+ 默认垃圾收集器

⚙️ 使用的算法:

  • 新生代:复制

  • 老年代:标记-整理

  • 全区:Region + 分代 + 指令式分区压缩


🔁 GC 执行过程(按区 Region 回收):

阶段类型说明
1. 初始标记(Initial Mark)STW标记 GC Roots,顺便触发 Minor GC
2. 并发标记(Concurrent Mark)并发从 GC Roots 开始找存活对象
3. 最终标记(Remark)STW使用 SATB 算法,修正标记结果
4. 筛选回收(Cleanup)STW/并发根据各 Region 的垃圾比例,优先清除“回收价值最大”的 Region


💡 G1 特点:

  • 将堆划分为多个 Region(而非新老代)

  • 根据 Region 的回收价值排序,优先清除「收益最高」的部分

  • 支持并发标记 + 并发整理(压缩)

  • 默认启用 -XX:+UseG1GC


面试答题:

G1 是面向服务端的大堆优化收集器,通过将堆划分为若干 Region,实现局部收集与全堆管理结合。G1 回收过程包含初始标记、并发标记、最终标记和筛选回收四个阶段,能够同时满足高吞吐和低停顿的需求,是当前最推荐的垃圾回收器之一。


🌈 三、ZGC(Z Garbage Collector)

✅ 目标:

超低延迟(Pause < 10ms),支持大堆内存(最高 16TB)

⚙️ 使用的算法:

  • 并发标记 + 并发重分配(无 STW 整理)

  • 所有阶段几乎都 并发进行

  • 使用染色指针load barriers


🔁 GC 执行阶段:

阶段类型说明
1. 并发标记(Concurrent Mark Start)并发从 GC Roots 出发标记对象
2. 并发准备重分配并发计算对象移动后的地址
3. 并发重分配(Relocation)并发对象移动,引用自动指向新位置
✔️ 所有暂停时间 < 1ms,真正实现“几乎无感” GC


技术亮点:

  • 染色指针:将对象头指针作为 GC 元数据容器(空间压缩技巧)

  • Load Barrier:解决对象移动时访问同步的问题

  • 几乎100% 并发,最大限度减少 STW


面试答题:

ZGC 是面向大内存与低延迟场景的现代垃圾回收器,其全部回收阶段几乎都并发执行,仅在少量场景进行毫秒级暂停。它使用染色指针与 Load Barrier 技术,无需停顿即可移动对象,彻底解决了传统收集器在大堆与高并发下的性能瓶颈。


📊 四、G1 vs CMS vs ZGC 总结对比

特性/收集器CMSG1ZGC
回收算法标记-清除分区复制 + 整理并发标记 + 并发整理
碎片问题无(整理)
停顿时间两次 STW,较短可预测 STW(低)极低(<10ms)
吞吐率中高
并发能力极强
是否移动对象
适合场景延迟敏感大堆、平衡场景超低延迟、大内存

✅五、 CMS 与 G1 在回收策略上的关键区别:是否“评估回收收益”

特性CMS(Concurrent Mark Sweep)G1(Garbage First)
内存结构明确的新生代 + 老年代全堆划分为等大小 Region(含 Eden/Survivor/Old)
回收算法标记 - 清除(老年代)
复制(新生代)
Region 内并行复制 + 并发标记 + 并发整理
回收粒度整体老年代分区 Region 级别(可选高性价比的回收区)
是否评估“收益”❌ 否:只做全量或阈值触发回收✅ 是:回收前计算各 Region 的回收收益 = 垃圾量 / 回收成本,优先清除性价比最高的
清理效果不整理内存,可能有碎片自动整理 Region,几乎无碎片
停顿控制停顿短,但不可控停顿可预测、可配置(如目标 200ms)
回收目标最小停顿(响应快)响应+吞吐平衡、最大性价比

🧠 六、JVM垃圾回收器 你可以这样答面试官(组合型模板)

JVM 提供了多种垃圾回收器,适用于不同场景:

  • CMS 使用标记-清除算法,低延迟但易碎片;

  • G1 是 JDK 默认收集器,划分 Region,结合分代管理和按需回收,实现较好的吞吐与停顿平衡;

  • ZGC 则是超低延迟收集器,所有阶段几乎并发执行,最大暂停低于 10ms,适用于金融、电商等延迟敏感系统。

🧠七 、CMS 和 G1区别 可以这样答面试题:

CMS 和 G1 都是以低延迟为目标的收集器。CMS 采用“标记-清除”算法进行老年代回收,虽然并发执行减少了停顿,但因为不整理内存,容易产生碎片,Full GC 风险较高。而 G1 将堆划分为多个 Region,通过计算每个 Region 的“回收收益”来确定回收优先级,优先清除性价比最高的部分,实现可预测、可配置的低延迟回收。相比 CMS,G1 更智能且对大堆支持更好。


相关文章:

  • Python实战应用-Python操作MySQL数据库
  • leetcode2-两数相加
  • 【CF】Day84——Codeforces Round 862 (Div. 2) D (⭐树的直径的性质 + DFS找树的直径)
  • K8S中使用英伟达GPU
  • 在 CentOS中安装Docker并安装青龙脚本——笔记
  • Vue3 实现老虎机抽奖游戏
  • Spring AI Alibaba Graph 实践
  • 【AD笔记】嘉立创元件导入到AD中(原理图-pcd-3D模型)
  • Elasticsearch从安装到实战、kibana安装以及自定义IK分词器/集成整合SpringBoot详细的教程ES(四)查询、排序、分页、高亮
  • DBAPI如何实现API编排
  • Excel大厂自动化报表实战(互联网金融-数据分析周报制作下)
  • 仿飞书部门选择器
  • 【YOLO 系列】基于YOLO的车载摄像头道路标志和车辆目标检测识别系统【python源码+Pyqt5界面+数据集+训练代码】
  • ELK 日志分析系统深度解析与实战指南
  • C++批量读取指定后缀文件
  • GTSAM中InitializePose3::initialize()使用详解
  • 介绍常见的图像和视频存储格式以及其优劣势
  • 大模型在颈椎管狭窄诊疗中的应用研究报告
  • 【驱动设计的硬件基础】串口
  • aflplusplus:开源的模糊测试工具!全参数详细教程!Kali Linux教程!(三)
  • 旅游门户网站源码怎么做的/今日新闻摘抄十条简短
  • 怎么帮助网站推广/seo索引擎优化
  • 那个平台的网页游戏好玩/baiduseoguide
  • 汉中建网站/seo网站关键词优化工具
  • 建筑规范网站/抖音广告
  • 品牌商城网站开发/如何查看网站权重