李锋镝的博客

  • 首页
  • 时间轴
  • 说说
  • 读书观影
  • 系列
  • AI工具集
  • 论坛
  • 友圈
    • 友链
    • 朋友圈
    • 游客中心
  • 留言
    • 留言
    • 走心评论
  • 关于
    • 关于本站
    • Now
    • 每日心情
    • 网站地图
    • 网站统计
    • 赞助
  • 星球穿梭
  • 🚇开往
静亦定 动亦定
惟坚韧者始能遂其志
  1. 首页
  2. 原创
  3. 正文

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

2025年2月15日 247 1 0
本文最后更新于 2025年2月15日,距今已 628 天,其中的信息可能已经发生变化,请注意甄别。

在 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 版本要求以及内存碎片与吞吐量等方面存在着诸多区别。开发者在选择垃圾回收器时,需要根据应用程序的具体特点,如内存规模、延迟要求、吞吐量需求等,综合考虑选择最适合的垃圾回收器,以确保应用程序能够在高效、稳定的环境中运行。
 
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
分享到

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

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

微信扫一扫分享

标签: G1 GC JAVA ZGC
最后更新:2025年2月15日

岁月同一天 11 月 6 日

回望过去的今天,你在写什么

  • AI
    1 年前 2025年11月6日
    AI能写代码,却造不出软件:软件工程的核心竞争力从未改变

    “我用AI拼了个Demo,就差上线了,能帮我变成产品吗?” 最近越来越多非技术从业者带着这样的需求找上门——他们可能是律…

  • 代码人生
    1 年前 2025年11月6日
    西蒙学习法实战指南:6个月攻克新领域,从入门到能用的高效路径

    作为IT从业者,我们每天都面临新技术的冲击——今天是AI大模型,明天是云原生,后天是低代码开发。有限的时间与无限的学习需…

  • AI
    1 年前 2025年11月6日
    从Token到计费:大模型背后的文本编码逻辑与商业本质

    你是否有过这样的困惑?——给大模型发一段500字的中文需求,却被扣除了800多个Token;同样一篇文章,在GPT-4中…

  • 6 年前 2020年11月6日
    8条经验轻松上手IDEA插件开发

    IDEA作为我们(后端Java开发者)必不可少的IDE,以其智能的代码提示、多样的框架支持、简洁的开发界面等特性,被业界…

  • 其他
    7 年前 2019年11月6日
    架构师究竟比高级开发厉害在哪?

    目前我在互联网公司里干了1年多,接触了多位技术和业务的架构师,由于我正在升级到架构师,所以能直观地感受到高级开发和架构的…

  • 转载
    7 年前 2019年11月6日
    如何在面试中介绍自己的项目经验

    在面试时,经过寒暄后,一般面试官会让介绍项目经验 。常见的问法是,说下你最近的(或最拿得出手的)一个项目。 根据我们的面…

相关文章
  • Spring Boot 配置加载优先级总结2026年8月6日
  • JAVA设计模式-工厂方法模式2020年2月3日
  • 解锁 Java 开发全流程效率:17 个必备工具深度指南2025年10月14日
  • Java整数运算2022年7月15日
  • 别再背线程池的七大参数了,现在面试官都这么问2025年5月15日

李锋镝

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

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

文章评论

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

上邪!我欲与君相知,长命无绝衰。
山无陵,江水为竭,冬雷震震,夏雨雪,天地合,乃敢与君绝。

听点儿音乐吧 朋友~
文章目录
最新 热点 随机
最新 热点 随机
给服务器加了WAF 又一个逆天改命的人:小小徐 AI的生成能力等于生产力吗? NGINX严重漏洞(CVE-2026-15176、CVE-2026-93479、CVE-2026-97205) Kratos-plus v1.1.27更新说明 php2shell远程执行漏洞修复(CVE-2026-109618 和 CVE-2026-109619)
给主题增加了游客中心功能心气没了,干什么都不得劲我觉得是时候公布我的导航网站了游本昌去世关于主题加载速度优化的一点儿小演进给主题增加了Now、每日心情、年度回顾、岁月同一天、随机漫步等功能
妹妹的画【2019.07.05】 RAG太难学?LLM Wiki了解一下 Kratos+ v1.1.18版本更新说明 Redis实例CPU飙高至90%:从根源排查到彻底解决的全攻略 重构 Controller 终极指南:从臃肿到优雅的 7 大黄金法则 + 实战技巧 C++之父重磅发声:AI编程正在毁掉一代程序员
最近评论
Hary 发布于 11 小时前(11月05日) 前几天看博友发的宝塔防火墙不就是一坨吗,还是算了。这WAF是可以直接部署在网站同一台服务器么
李锋镝 发布于 19 小时前(11月05日) 感谢来访,祝越来越好~
李锋镝 发布于 23 小时前(11月05日) 应该就是请求太频繁了,我看看合并一下静态资源这些
不凡 发布于 23 小时前(11月05日) 我打开这篇文章时,看到评论列表中的操作系统图标、浏览器图标和国家图标这三个都挂了,楼下的头像也挂了,...
李锋镝 发布于 23 小时前(11月05日) 触发CC防护了 我把限制改大一些
标签聚合
日常 Claude AI JAVA ElasticSearch K8s 数据库 SpringBoot 架构 Spring AI编程 多线程 分布式 Redis SQL IDEA WordPress Theme JVM MySQL
友情链接
  • 志文工作室
  • 林羽凡
  • 韩情脉脉
  • 九仞之行
  • sssr7844的博客
  • Honesty
  • Mr.Sun的博客
  • Serendipity
  • 刘永博客
  • 皮皮社
  • 老张博客
  • 搬砖日记
  • 哥斯拉
  • 彬红茶日记
  • 懋和道人
  • 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号