NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

Java ZGC 垃圾收集器全面增强

  • 2023-08-15
    北京
  • 本文字数:1388 字

    阅读完需:约 5 分钟

Java ZGC 垃圾收集器全面增强

在 JDK 21 中,JEP 439(分代ZGC)从 Targeted 状态提升到 Completed 状态。该 JEP 建议,扩展 Z Garbage Collector(ZGC),为年轻对象和老对象维护单独的代,从而提高应用程序的性能。这将使得 ZGC 可以更频繁地收集趋于早亡的年轻对象。

 

Z Garbage Collector 专为低延迟和高可扩展性而设计,从 JDK 15 开始就可用于生产环境。它的大部分工作都是在应用程序线程运行过程中完成的,只会短暂中断这些线程。ZGC 的暂停时间以微秒为单位进行持续的测量,这使得它成为低延迟、高可扩展工作负载的首选。

 

新一代 ZGC 旨在降低分配停顿的风险,减少所需的堆内存开销,并减少垃圾收集的 CPU 开销。与非分代 ZGC 相比,这些优点预计并不会显著降低吞吐量。非分代 ZGC 的基本性质保持不变,如暂停时间不超过 1 毫秒,支持的堆大小从几百 MB 到许多 TB。

 

分代 ZGC 基于弱分代假说,即年轻对象往往会在年轻时死去,而老对象往往会保留下来。通过更频繁地收集年轻对象,ZGC 可以提高应用程序的性能。

 

最初,分代 ZGC 与非分代 ZGC 是一起提供的。用户可以在-XX:+UseZGC命令行选项中添加-XX:+ZGenerational选项,以选择 Generational ZGC。在未来的版本中,分代 ZGC 将成为默认选项,最终,非分代 ZGC 将被删除。

$ java -XX:+UseZGC -XX:+ZGenerational ...
复制代码

 

新的分代 ZGC 将堆划分为两个逻辑代:年轻代用于最近分配的对象,老年代用于长期对象。每个代独立收集,让 ZGC 可以专注于收集有利可图的年轻对象。

 

分代 ZGC 引入了多个使其不同于非分代 ZGC 和其他垃圾收集器的设计概念,包括无多重映射内存、优化屏障、双缓冲记忆集、无追加堆内存重定位、密集堆区域、大对象和完整垃圾收集。

 

分代 ZGC 的引入可以大幅提升在 Java 平台上运行应用程序的性能。通过更频繁地收集年轻对象,分代 ZGC 可以带来更低的延迟、更少的内存开销和更高的 CPU 利用率。这使得它在大多数用例中都成为比非分代 ZGC 更好的解决方案。

 

它引入了一个更复杂的系统。该系统在加载和存储屏障中使用了显式代码,并且并发运行两个垃圾收集器。新系统不使用多重映射内存,使用户更容易测量堆内存的使用情况,并可能将最大堆大小增加到超过非分代 ZGC 的 16TB 限制。加载和存储屏障使用快速路径和慢速路径、记忆集屏障、SATB 标记屏障、融合存储屏障检查和存储屏障缓冲等技术进行了优化。分代 ZGC 还引入了双缓冲记忆集,用于准确跟踪代际指针,并允许重定位,而且不需要额外的堆内存,进而实现高效的年轻代收集。该系统还可以很好地处理大对象,允许将它们分配给年轻代,而如果它们的寿命比较长,就将它们提升到老年代。完整垃圾收集将年轻代对象指向老年代对象的指针视为老年代对象图的根。

 

总之,OpenJDK 中的分代 ZGC 实现引入了一个更为复杂的系统,它并发运行两个垃圾收集器,并使用更复杂的屏障和染色指针(coloured pointer)。尽管复杂,但长期目标是用分代版本完全替换非分代 ZGC,以最小化维护成本。虽然大多数用例都有望从分代 ZGC 中受益,但一些非分代工作负载可能会出现轻微的性能下降。不过,因为不必频繁地收集老年代的对象,所以可以认为潜在的开销已被抵消。分代 ZGC 未来的改进和优化将由基准测试和用户反馈所驱动。分代 ZGC 的引入是提高 Java 平台应用程序性能的重要一步。

 

原文链接:

https://www.infoq.com/news/2023/07/java-enhance-zgc/


相关阅读:

Java 近期新闻:Micronaut 4.0、Payara 平台、Spring Web Flow 3.0、JetBrains AI 助手

Java 新特性完整指南:Switch 模式匹配

2023-08-15 08:006661

评论 1 条评论

发布
用户头像
“在未来的版本中,分代 ZGC 将成为默认选项,最终,非分代 ZGC 将被删除。”这里不太对,java21发布版本是非分代的。
2023-11-22 17:13 · 北京
回复
没有更多了
发现更多内容

吃人血馒头 VC 机构,是否还能在 Fair launch 的散户牛市中胜出?

EOSdreamer111

PreparedStatement实践和批处理实践

FunTester

2024-01-10:用go语言,给你一个下标从 0 开始的二维整数数组 pairs 其中 pairs[i] = [starti, endi] 如果 pairs 的一个重新排列 满足对每一个下标 i

福大大架构师每日一题

福大大架构师每日一题

使用JMeter安装RabbitMQ测试插件的步骤

百度搜索:蓝易云

云计算 Linux 运维 RabbitMQ Jmeter

如何利用 NFTScan Portfolio 功能分析钱包 NFT 持仓

NFT Research

NFT NFT\ NFTScan

网易首款鸿蒙原生游戏《倩女幽魂》手游完成开发,商业化版本已就绪

新消费日报

从像素到洞见:图像分类技术的全方位解读

不在线第一只蜗牛

机器学习 深度学习 图像 项目开发

C 语言文件读取全指南:打开、读取、逐行输出

小万哥

程序人生 编程语言 软件工程 C/C++ 后端开发

文心大模型融入荣耀MagicOS!打造大模型“端云协同”创新样板

爱编程的喵喵

极狐 GitLab 冷知识:使用 Email 也可以创建 Issue?

极狐GitLab

关于AI PC,英特尔CEO帕特·基辛格说了三个法则

E科讯

🛠 开源即时通讯(IM)项目OpenIM源码部署指南

Geek_1ef48b

传统 VC 机构,是否还能在 Fair launch 的散户牛市中胜出?

股市老人

传统 VC 机构,是否还能在 Fair launch 的散户牛市中胜出?

加密眼界

数字化转型究竟是什么意思?

高端章鱼哥

数字化

🛠 开源即时通讯(IM)项目OpenIM源码部署指南

Geek_1ef48b

Programming Abstractions in C阅读笔记:p242-p245

codists

Go与C语言的互操作,import “C“的实例

百度搜索:蓝易云

Go 云计算 Linux C语言 云服务器

docker rabbitmq-清空queue队列数据

百度搜索:蓝易云

云计算 Linux 运维 RabbitMQ 云服务器

软件测试/测试开发全日制|Pytest结合Excel实现数据驱动

霍格沃兹测试开发学社

传统 VC 机构,是否还能在 Fair launch 的散户牛市中胜出?

西柚子

坎昆升级在即,ZKFair 已开启 ZKF 质押

股市老人

传统 VC 机构,是否还能在 Fair launch 的散户牛市中胜出?

BlockChain先知

吃惯人血馒头的 VC 机构,是否还能在 Fair launch 的散户牛市中胜出?

长安区块链

传统 VC 机构,是否还能在 Fair launch 的散户牛市中胜出?

大瞿科技

传统 VC 机构,是否还能在 Fair launch 的散户牛市中胜出?

石头财经

可编程线性霍尔传感器 IC

智趣匠

Kubernetes Pod配置:从基础到高级实战技巧

互联网工科生

Kubernetes

软件测试/测试开发全日制|Pytest结合yaml实现数据驱动

霍格沃兹测试开发学社

端侧AI的“春风化雨手”,翻开中国科技下一页

脑极体

AI

在线文档软件哪个好?5个好用的协同文档app推荐!

彭宏豪95

团队协作 在线文档 在线白板 在线协同文档 效率软件

Java ZGC 垃圾收集器全面增强 _编程语言_A N M Bazlur Rahman_InfoQ精选文章