李锋镝的博客

  • 首页
  • 时间轴
  • 说说
  • 每日心情
  • Now
  • 系列文章
  • 论坛
  • 左邻右舍
    • 左邻右舍
    • 博友圈
  • 留言
    • 留言
    • 走心评论
  • 关于
    • 关于本站
    • 网站地图
    • 网站统计
    • 另一个网站
    • 我的导航站
    • 赞助
  • 🚇开往
!Destiny
惟坚韧者始能遂其志
  1. 首页
  2. 原创
  3. 正文

深入剖析 ZGC 和 G1 垃圾回收器的区别

2025年2月15日 约 1,847 字7 分钟 166 1 0
本文最后更新于 2025年2月15日,距今已 582 天,其中的信息可能已经发生变化,请注意甄别。

在 Java 虚拟机(JVM)的世界里,垃圾回收器扮演着至关重要的角色,它负责自动管理内存,回收不再使用的对象所占用的内存空间,从而保证应用程序的稳定运行。随着 Java 技术的不断发展,出现了多种垃圾回收器,其中 ZGC 和 G1 备受关注。这两者在功能上有相似之处,但在实现机制、性能表现以及适用场景等方面存在着显著的区别。

内存管理方式

ZGC

ZGC 采用了基于 Region 的内存布局方式,将堆内存划分为多个大小不同的 Region,包括小型 Region(2MB)、中型 Region(32MB)以及大型 Region(其大小为 2MB 的整数倍)。与传统的分代管理不同,ZGC 暂时不区分代际,所有对象都可以在任何 Region 中分配。这种不分代的设计简化了内存管理的复杂性,尤其对于大对象和小对象的分配策略更加统一,能够更高效地利用内存空间。

G1

G1 同样把 Java 堆划分为多个大小相等的 Region,但它保留了分代的概念。在这些 Region 中,明确区分出年轻代和老年代。年轻代用于存放新创建的对象,老年代则用于存放经过多次垃圾回收仍然存活的对象。这种分代管理方式能够根据对象的生命周期特点,采用不同的回收策略,提高垃圾回收的效率。

垃圾回收算法

ZGC

ZGC 主要基于染色指针和读屏障技术实现了并发标记 - 整理算法。在标记阶段,ZGC 通过更新颜色指针中的标记位来标记对象的状态,这样在后续的操作中,通过读取指针上的标记就能快速判断对象的状态,无需额外的对象访问。在重分配阶段,ZGC 会将存活对象复制到新的 Region 中,并利用转发表和指针自愈功能来处理对象引用的变化,确保对象引用的正确性。

G1

G1 整体采用的是 “标记 - 整理” 算法,而在局部处理年轻代时则基于 “复制” 算法。在标记阶段,G1 使用 SATB(Snapshot - At - The - Beginning)算法来记录对象引用的变化,确保在并发标记过程中能够准确识别存活对象。在筛选回收阶段,G1 会根据每个 Region 中垃圾对象的比例,优先回收垃圾比例高的 Region,以达到高效回收内存的目的。

停顿时间

ZGC

ZGC 的设计目标是实现极低的停顿时间,通常情况下,其停顿时间能够控制在不超过 10ms。这一卓越的性能表现得益于其并发执行的特性,使得大部分垃圾回收工作可以与应用程序的运行同时进行。即使面对大规模的堆内存,ZGC 也能保持极低的停顿,这对于那些对延迟要求极高的应用场景,如金融交易系统、实时游戏等,具有极大的优势。

G1

G1 可以通过参数设置目标停顿时间,能够将停顿时间控制在一定的范围内。然而,与 ZGC 相比,G1 的停顿时间通常较长,一般在几百毫秒级别。虽然这对于许多应用来说已经是可接受的范围,但在对延迟极为敏感的场景下,G1 的停顿时间可能会对应用性能产生一定的影响。

适用场景

ZGC

由于其极低的延迟特性,ZGC 适用于超大堆内存(例如 8GB 以上甚至达到 TB 级)且对延迟要求极高的场景。在金融领域的高频交易系统中,每毫秒的延迟都可能导致巨大的损失,ZGC 能够确保交易系统在处理大量交易数据时,垃圾回收过程不会对交易的实时性产生影响。在实时游戏开发中,ZGC 可以保证游戏服务器在处理众多玩家的操作指令时,始终保持流畅的运行状态,避免因垃圾回收停顿而导致的游戏卡顿现象。

G1

G1 适用于内存管理较为复杂、堆内存较大(建议 8GB 以上)的场景。在实时分析系统中,需要处理大量的数据并进行实时分析,G1 的分代管理和高效回收策略能够有效地管理内存,满足系统对内存的高需求。对于大型 Java 应用,G1 在保证一定吞吐量的同时,能够较好地控制垃圾回收的停顿时间,为应用提供稳定的运行环境。

对 JVM 版本的要求

ZGC

ZGC 是 Java 11 及以上版本引入的垃圾回收器,因此使用 ZGC 需要基于 Java 11 及更高版本的 JVM 环境。这意味着在一些旧版本的 Java 应用中,如果想要使用 ZGC,需要进行 JVM 版本的升级。

G1

G1 在 Java 7 u4 版本就已经正式投入使用,并且在 Java 9 及以上版本中得到了更好的支持和优化。这使得 G1 能够在更广泛的 Java 版本环境中使用,对于一些无法立即升级到最新 Java 版本的应用来说,G1 是一个较为合适的选择。

内存碎片与吞吐量

ZGC

通过并发整理内存,ZGC 能够有效地保持内存的连续性,几乎不会产生内存碎片。然而,由于 ZGC 需要处理读屏障等操作,这会带来相对较高的 CPU 开销,从而在一定程度上影响了吞吐量。不过,在对延迟要求极高的场景下,这种吞吐量的牺牲是可以接受的。

G1

G1 通过分区压缩等方式,有效地减少了内存碎片的产生。同时,G1 在吞吐量方面表现较好,能够在优化内存利用率的同时,保证应用程序具有较高的吞吐量。这使得 G1 在对吞吐量和内存利用率都有一定要求的场景中具有明显的优势。
综上所述,ZGC 和 G1 垃圾回收器在内存管理、垃圾回收算法、停顿时间、适用场景、对 JVM 版本要求以及内存碎片与吞吐量等方面存在着诸多区别。开发者在选择垃圾回收器时,需要根据应用程序的具体特点,如内存规模、延迟要求、吞吐量需求等,综合考虑选择最适合的垃圾回收器,以确保应用程序能够在高效、稳定的环境中运行。
 
除非注明,否则均为李锋镝的博客原创文章,转载必须以链接形式标明本文链接

本文链接:https://www.lifengdi.com/article/4177

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
分享到

深入剖析 ZGC 和 G1 垃圾回收器的区别

也可使用浏览器菜单中的「分享」功能

微信扫一扫分享

标签: G1 GC JAVA ZGC
最后更新:2025年2月15日
相关文章
  • 如何在面试中介绍自己的项目经验2019年11月6日
  • Java通用枚举还能这样做?前后端终于不扯皮了!2025年10月21日
  • SpringBoot启动概述(SpringBoot2.1.7)2020年1月10日
  • Java SPI详解2021年4月16日
  • SpringBoot和SpringCloud版本对应2019年8月29日

李锋镝

既然选择了远方,便只顾风雨兼程。

打赏 点赞
< 上一篇
下一篇 >
1234567891112131415161718192021222324252627282930313233343536373839404142434446474849505152535455575859606162636465666769727476777879808182858687909293949596979899
取消回复
…

文章评论

还没有评论,快来抢沙发吧~

莫听穿林打叶声,何妨吟啸且徐行。
竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。
料峭春风吹酒醒,微冷,山头斜照却相迎。
回首向来萧瑟处,归去,也无风雨也无晴。

听点儿音乐吧 朋友~
文章目录
最新 热点 随机
最新 热点 随机
让WordPress静态化之Rocket‑Nginx WordPress下一代默认主题Ipsum预览 C++之父重磅发声:AI编程正在毁掉一代程序员 支撑全网40%网站的WordPress正在重新拥抱PHP生态 Kratos-plus v1.1.24版本更新说明 关于主题加载速度优化的一点儿小演进
关于主题加载速度优化的一点儿小演进给主题增加了Now、每日心情、年度回顾、岁月同一天、随机漫步等功能WordPress缓存插件WP Fastest Cache、WP Rocket 、FlyingPress对比关于使用AI的一些思考Kratos+ v1.1.16版本更新说明AI时代,个人技术博客的出路在哪里?
WordPress网站换了个字体,差点儿把样式换崩了 10 个MQ高频业务场景深度解析 写了个日期进度条的小插件 Ollama:重新定义本地大模型运行的开源革命 Yoast SEO 变量汇总 分布式服务生成唯一不重复ID(24位字符串)
最近评论
李锋镝 发布于 23 小时前(09月20日) 静态博客我之前也用过,但是感觉不是很方便,后来就一直用的WordPress
Sheep5 发布于 1 天前(09月20日) 我直接用静态博客,天然有速度优势。
不凡 发布于 1 天前(09月20日) 主要是wordpress插件丰富,需要什么功能插件,插件市场应有尽有,typecho是性能更好、更轻...
李锋镝 发布于 1 天前(09月20日) 忒极简了,而且这个布局我也搞不懂
李锋镝 发布于 1 天前(09月20日) 哈哈哈~自定义的功能都是符合自己需求的
标签聚合
分布式 日常 ElasticSearch Spring WordPress SpringBoot Redis JVM MySQL 多线程 AI K8s Claude SQL IDEA AI编程 数据库 架构 JAVA MQ
友情链接
  • 老张博客
  • Honesty
  • 临窗旋墨
  • 皮皮社
  • 若梦博客
  • Serendipity
  • 九仞之行
  • 彬红茶日记
  • 懋和道人
  • 韩小韩博客
  • sssr7844的博客
  • 志文工作室
  • 蜗牛工作室
  • 搬砖日记
  • Mr.Sun的博客
  • lijie blog
  • 知向前端
  • 哥斯拉
  • 韩情脉脉
  • 林羽凡

COPYRIGHT © 2016-2026 lifengdi.com. ALL RIGHTS RESERVED.

lifengdi.com

Domain age badge for lifengdi.com

Theme Kratos-plus By Dylan Li

津ICP备2024022503号-3

京公网安备11011502039375号