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

CMS、G1、ZGC、Shenandoah 的全面对比

大家好,这里是架构资源栈!点击上方关注,添加“星标”,一起学习大厂前沿架构!

Java 垃圾回收器从最早的 Serial 一步步演化,如今已经有了多款高性能、低延迟的 GC 垃圾收集器可选,比如 CMS、G1、ZGC、Shenandoah。到底它们有啥区别?适合哪些业务场景?一文讲透👇


🧠 GC 垃圾收集器发展图谱

Serial -> Parallel -> CMS -> G1 -> ZGC / Shenandoah

注:JDK8 以前主要是 CMS 和 Parallel,JDK9 之后 G1 成为默认收集器,JDK11+ 后 ZGC、Shenandoah 崭露头角。


📦 各主流 GC 收集器全景对比

收集器停顿时间吞吐量并发回收吞吐目标/延迟目标特点适用场景
CMS中等偏高✅ 是响应时间优先老年代并发回收,减少 STW 时间响应敏感型应用,如 Web 服务
G1中等 ~ 低中等✅ 是吞吐 & 延迟均衡分区收集,避免碎片,JDK 默认选项混合型业务,JDK 默认选择
ZGC极低(<10ms)中等✅ 是极低延迟(毫秒级)彩色指针、Region 化,支持 TB 级堆低延迟系统、超大内存应用
Shenandoah极低(<10ms)中等✅ 是极低延迟(毫秒级)并发整理,空闲 compact,不需 stop响应敏感场景,如在线支付系统

🔍 收集器特性深度解析

♻️ CMS(Concurrent Mark Sweep)

  • 工作方式:并发标记+并发清除,最早的低停顿收集器之一。

  • 优点

    • 大部分阶段与用户线程并发执行;
    • 停顿时间远低于 Serial / Parallel。
  • 缺点

    • 容易产生“内存碎片”;
    • Stop-the-World 多次触发;
    • 即将被 G1 替代(JDK 9 之后已标记为废弃)。

🔧 适合场景:老年代对象存活率高,业务对响应时间敏感。


🧬 G1(Garbage First)

  • 设计目标:兼顾吞吐量和低延迟。

  • 特点

    • 分区(Region)机制;
    • 可预测的停顿时间;
    • 支持部分并发整理。
  • 缺点

    • 相较 CMS 停顿更稳定,但最大停顿时间不一定更短;
    • 吞吐量略低于 CMS/Parallel。

🔧 适合场景:电商、社交类中大型项目,推荐默认使用。


⚡️ ZGC(Z Garbage Collector)

  • 目标:亚毫秒级别 GC 停顿(<10ms),支持 TB 级内存

  • 特点

    • 彩色指针+读屏障;
    • Region 化内存布局;
    • 几乎全并发,GC 不影响用户线程;
    • 从 JDK 15 起正式可用于生产。
  • 缺点

    • 目前仅支持 Linux / macOS / Windows 的 64 位系统;
    • 最大吞吐量略低。

🔧 适合场景:低延迟需求极高的服务(如金融风控、广告系统)。


🛰️ Shenandoah

  • 目标:低延迟(<10ms)+ 并发整理,真正“Pause Time 不随堆大小增长”。

  • 特点

    • 并发压缩对象,打破 CMS / G1 的 STW 整理局限;
    • 与 ZGC 类似,也使用读屏障;
    • 可在 JDK12+ 开启使用(JDK17 后正式生产可用)。
  • 缺点

    • 实现复杂、CPU 开销略高;
    • 与 G1 类似,吞吐量适中。

🔧 适合场景:低延迟、大堆内存项目,如物联网、即时计算平台。


🧭 选型建议

业务场景推荐 GC说明
吞吐优先Parallel GC简单粗暴,STW 时间长但效率高
响应时间优先CMS / Shenandoah停顿低,适合 Web、支付类系统
低延迟、超大堆内存ZGC / Shenandoah停顿极低,支持 TB 级堆
默认 JDK 设置G1综合性能均衡,几乎无脑选

🔚 写在最后

GC 没有“银弹”,只有“适合”。理解各种 GC 的特点后,结合业务特性才能做出最佳选择。未来,ZGC 和 Shenandoah 正逐步成为低延迟服务的标配,而 G1 仍然是多数企业的主流选择。

http://www.lryc.cn/news/2404127.html

相关文章:

  • RabbitMQ 学习
  • 如何轻松、安全地管理密码(新手指南)
  • AWS App Mesh实战:构建可观测、安全的微服务通信解决方案
  • 9.axios底层原理,和promise的对比(2)
  • 用HTML5 Canvas打造交互式心形粒子动画:从基础到优化实战
  • Gartner《How to Create and Maintain a Knowledge Base forHumans and AI》学习报告
  • 【软件工具】批量OCR指定区域图片自动识别内容重命名软件使用教程及注意事项
  • PyTorch 中cumprod函数计算张量沿指定维度的累积乘积详解和代码示例
  • docker镜像下载到本地,并导入服务器
  • 数据通信与计算机网络——数字传输
  • oracle 归档日志与RECOVERY_FILE_DEST 视图
  • 黄柏基因组-小檗碱生物合成的趋同进化-文献精读142
  • 前端杂货铺——TodoList
  • Spring Boot SSE流式输出+AI消息持久化升级实践:从粗暴到优雅的跃迁
  • camera功能真的那么难用吗
  • Model Context Protocol (MCP) 是一个前沿框架
  • SQL Server 日期时间类型全解析:从精确存储到灵活转换
  • Android Test3 获取的ANDROID_ID值不同
  • [蓝桥杯 2024 国 B] 立定跳远
  • 内容力重塑品牌增长:开源AI大模型驱动下的智能名片与S2B2C商城赋能抖音生态种草范式
  • 手机号在网状态查询接口如何用PHP实现调用?
  • 【Java微服务组件】分布式协调P4-一文打通Redisson:从API实战到分布式锁核心源码剖析
  • 一个简单的德劳内三角剖分实现
  • Python入门手册:异常处理
  • C#子线程更新主线程UI及委托回调使用示例
  • 使用VuePress2.X构建个人知识博客,并且用个人域名部署到GitHub Pages中
  • 手写Promise.all
  • 调试器基本原理
  • 2025年6月|注意力机制|面向精度与推理速度提升的YOLOv8模型结构优化研究:融合ACmix的自研改进方案
  • JAVA开发代码小工具集合