侧边栏壁纸
  • 累计撰写 235 篇文章
  • 累计创建 71 个标签
  • 累计收到 5 条评论

目 录CONTENT

文章目录

仍然嫌GC卡顿?新一代低延迟GC了解一下

橙序员
2025-08-03 / 0 评论 / 0 点赞 / 176 阅读 / 2,314 字 / 正在检测百度是否收录... 正在检测必应是否收录...
文章摘要(AI生成)

本文讨论了Java中ZGC(Z Garbage Collector)垃圾收集器的核心机制与优化演进,ZGC是一种超低延迟的垃圾收集器,适用于大堆内存和高并发场景。文章首先介绍了不同版本JDK(如JDK 11、15、16、21)对ZGC的支持和改进,包括并发线程栈处理和分代收集的引入。与传统的G1和CMS垃圾收集器相比,ZGC显著降低了停顿时间(通常小于1ms),并且能够有效管理TB级别的堆内存,适合延迟敏感的应用如在线服务和广告系统。 此外,文章提供了ZGC的启动和调优参数示例,并分析了在容器化环境下ZGC的资源管理优势。最后,探讨了主流Java框架与不同JDK版本的兼容性,强调了学习新技术以适应行业变化的重要性。通过对ZGC的深入了解,开发者能够更好地选择合适的GC方案,以提升应用性能和用户体验。

还在为 G1 垃圾回收器的长时间 STW 卡顿头疼?还在为 CMS 被移除发愁选什么 GC?今天这篇文章带你了解 ZGC —— Java 新一代超低延迟垃圾收集器,它是如何一步步成为生产可用的高性能选项的。

🎬真实场景:你是否也遇到过这些 GC 痛点?

在我们项目中,某个数据查询服务常因为 GC 导致 RT 波动剧烈。分析日志后发现:

  • 使用 G1 GC,在老年代扩容或 Full GC 时会出现 50~100ms 的 STW 卡顿
  • 已经升级到 JDK 17,CMS 被移除,选项更少

到了 JDK 17,主要可选的垃圾收集器(GC)及其作用于内存的不同区域如下:

✅ JDK 17 支持的垃圾收集器列表

收集器 年轻代 老年代 元空间 特点
Serial 单线程,适用于单核或小堆内存
Parallel (吞吐量优先) 多线程,关注吞吐率
CMS (已废弃) 并发回收,低停顿(JDK 14 起已删除)
G1 区域化管理,低延迟 + 吞吐平衡
ZGC 超低延迟,支持 TB 级堆内存
Shenandoah RedHat 提供,低延迟
Epsilon 无实际回收,仅做性能测试
  • ZGC 和 Shenandoah 的设计放弃了传统的“年轻代/老年代”划分,转而通过全堆并发管理,来实现更可预测、低停顿的回收
  • G1 GC 依旧维持年轻代和老年代的结构,但通过分区机制(Region)实现更灵活的内存管理。
  • JEP 376 将 ZGC 引入 Windows 和 macOS;
  • JEP 377 将 ZGC 宣布为生产级稳定垃圾回收器。
JDK17垃圾收集器

而ZGC作为JAVA支持容器化和超大堆管理的新GC,调研其背后的演进逻辑与实现原理对我们升级JDK有很大帮助。


😮什么是 GC?为什么它值得选?

ZGC(Z Garbage Collector)是 Oracle 在 JDK 11 中首次引入的 可伸缩、低延迟 GC,核心目标如下:

  • 超低暂停:最大 GC 停顿时间 < 1ms
  • 大堆支持:数百 GB 到多 TB 的堆都能高效处理
  • 高并发性:几乎所有阶段都并发执行

💘ZGC 核心机制一览

特性 描述
着色指针 (Colored Pointers) 在对象地址中编码 GC 状态,实现并发标记和转移
并发栈扫描 减少 STW,提升吞吐
Regionless 结构 避免 G1/CMS 的碎片和复杂管理
延迟低、扩展性强 天然适配云计算与容器环境

🌀ZGC 工作流程图解(全流程并发)

ZGC工作流

各阶段说明

  • 并发标记:识别存活对象(不影响应用线程)
  • 并发转移:对象迁移到新位置(无需暂停)
  • 重映射:更新引用指向新地址
  • STW 阶段:仅用于栈处理或类卸载等小任务(<1ms)

✅ 最大特点:整个 GC 生命周期中只有极短的 STW(通常 < 1ms)


✈ZGC演进路线与优化点

ZGC 虽早在 JDK 11 就已发布,但直到 JDK 15,才迎来两个关键优化,使它具备真正的“生产级”能力;从 JDK 21 开始,ZGC 也支持分代回收(Generational ZGC),在保持低延迟优势的同时,进一步优化了 吞吐性能和内存回收效率,可以更好地支持热点对象生命周期分布。

zgc演进路线

✨ JEP 333(JDK 11)

  • 初始引入 ZGC(实验性)
  • 支持 Linux/x64
  • 实现基础的低延迟 GC 架构

✨ JEP 376(JDK 15):并发线程栈处理

  • 原问题:线程栈扫描是 STW 阶段
  • 改进:线程栈扫描也变成并发执行
  • 影响:进一步降低 GC 停顿

✨ JEP 377(JDK 15):ZGC 正式 GA

  • 不再需要 -XX:+UnlockExperimentalVMOptions
  • 支持 Windows/macOS 平台
  • 准备进入生产场景

✨ JEP 439(JDK 16):跨平台支持强化

  • 正式支持 macOS 和 Windows 系统

✨ JEP 423(JDK 21):Generational ZGC

  • 支持分代收集(年轻代 / 老年代)
  • 结合 ZGC 与代际模型优点,提升吞吐与回收效率

👍ZGC 对比 G1/CMS,谁更适合你的场景?

特性 G1 GC CMS ZGC
停顿时间 可配置(仍可能几十ms) 不稳定 ☑ < 1ms
并发能力 中等 ☑ 极高
分代支持 JDK 21 起支持
最大堆支持 数百 GB 数百 GB ☑ 多 TB
容器适配 一般 ☑ 强

✨ 如果你的服务追求低延迟响应、GC 停顿难以接受,ZGC 是目前最优选择之一


🍕实战接入:如何启用 ZGC?

# 启动参数示例(JDK 15+)
java -XX:+UseZGC -Xms2g -Xmx4g -jar myapp.jar

常用调优参数

-XX:+UseLargePages
-XX:ZUncommitDelay=60   # 60秒无用内存后主动归还

💫开发者经验总结

  • ZGC 适合延迟敏感 + 大堆内存的系统:广告系统、游戏后端、在线服务网关
  • JDK 15 后才适合正式生产使用(特别是 JEP 377 生效)
  • 如果你使用容器/云平台部署,ZGC 对资源释放控制更优

📃来点篇外话

上篇文章发表后,大部分人还是对新版JDK不感冒的,但是随着AI编程的兴起,新项目的开发涉及容器化、响应式和提前编译等技术,不免会使用到新版本JDK,如同22年GPT还在空中楼阁一样,如果不学习新技术,那注定要被新技术淘汰.

这里附上目前主流 Java 框架对 Java 各版本(尤其是 Java 8、11、17、21)的支持情况汇总(截至 2025 年),涵盖老牌框架与新兴框架,供各位在大数据或后端项目开发选型时参考:

☕ 主流 Java LTS 版本一览(含使用趋势)

Java 版本 发布时间 支持状态 特点
Java 8 2014 ✅ 广泛支持 稳定,兼容性好,仍是部分项目首选
Java 11 2018 ✅ 主流使用 首个现代 LTS,模块化逐步落地
Java 17 2021 ✅ 趋于主流 性能提升大,支持新 GC、Sealed 类等
Java 21 2023 ✅ 快速增长 模式匹配、Record 增强,ZGC 更成熟

🧱 框架支持情况对比

✅ Web/后端开发框架支持情况

框架 Java 8 Java 11 Java 17 Java 21 说明
Spring 5.x ⚠️ 推荐配合 Java 8/11 使用
Spring Boot 2.7 ⚠️ 最后一个支持 Spring 5 的版本
Spring Boot 3.x(基于 Spring 6) 要求 Java 17+,全面支持 Jakarta EE 10
Quarkus 针对云原生优化,Java 17+表现更佳
Micronaut 启动快、占用低,推荐配合 Java 17+
Vert.x 响应式编程,兼容性好

🧠 数据处理 / 大数据生态框架支持情况

框架 Java 8 Java 11 Java 17 Java 21 说明
Apache Hadoop ⚠️ 主干仍围绕 Java 8,部分组件开始兼容 Java 11
Apache Spark ⚠️ Spark 3.5 开始兼容 Java 17(实验性)
Flink ⚠️ 1.18 起逐步引入 Java 17 支持
Kafka ⚠️ 推荐 Java 11,向 Java 17 迁移中
Akka 支持广泛,但注意许可政策变更

🌱 新兴生态或轻量框架

框架 Java 8 Java 11 Java 17 Java 21 说明
Helidon Oracle 出品云原生框架,推荐 Java 17+
Loom 支持库 ⚠️ Java 21 Loom 项目相关,虚拟线程支持
Spring Native / AOT AOT 编译需 Java 17 起步,增强 GraalVM 支持
0

评论区

欢迎访问shiker.tech

请允许在我们的网站上展示广告

您似乎使用了广告拦截器,请关闭广告拦截器。我们的网站依靠广告获取资金。

订阅shiker.tech

文章发布订阅~

通过邮箱订阅文章更新,您将在文章发布时收到及时的邮件提醒~