写点什么

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:007135

评论 1 条评论

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

电商“变法”,AI维新

脑极体

AI

oracle和mysql语句有哪些异同点?

伤感汤姆布利柏

为什么单元测试不是持续交付的唯一答案

敏捷开发

项目管理 DevOps CI/CD 测试 单元测试 产品研发

揭开华为云ADN提高网络质量的秘密

华为云开发者联盟

开发 网络 华为云 华为云开发者联盟 华为云DTSE

适合tiktok运营的云手机需要满足什么条件?

Ogcloud

云手机 海外云手机 tiktok云手机 Tik Tok

思码逸企业版 4.0 特性之一:支持 DevOps 全工具链数据分析

思码逸研发效能

无缝对接,提升企业办公与薪酬福利管理效率!

聚道云软件连接器

案例分享

如何正确编写代码注释:简易指南

Liam

程序员 前端 后端 代码 代码注释

一站式指南:ClkLog部署环境配置指南

ClkLog

一条龙服务利润新“玩”法

开源物联卡管理平台-设备管理

物联网 IoT eSIM安全 java 技术提升

基于Java开发的工作流管理系统,快速开发平台

金陵老街

DevData Talks | 金融大咖说:金融企业如何持续提升研发效能

思码逸研发效能

思码逸企业版 4.0 特性之二:支持 DevOps 全工具链数据分析

思码逸研发效能

以太坊 Dencun 升级与潜在机会

TechubNews

Ethereum 区块链、 #Web3

NFTScan | 02.12~02.18 NFT 市场热点汇总

NFT Research

NFT NFT\ NFTScan

极速提升测试效率:揭秘Web自动化三大等待技巧

测吧(北京)科技有限公司

测试

在script标签写export为什么会抛错|type module import ES5 ES6 预处理 指令序言 JavaScript JS

Geek_ee6d52

前端 JavaScrip

玩转 Go Slices 切片泛型库

陈明勇

Go golang 后端 go slices

命名虚拟机及设置安装路径

小魏写代码

数字化商品管理:革新鞋服零售模式,引领智能商业新时代

第七在线

跨境电商企业都在用的云手机是什么?

Ogcloud

云手机 海外云手机 云手机海外版 国外云手机 电商云手机

利用大数据和API优化电商决策:商品性能分析实践

Noah

海外云手机在电商平台的用途

Ogcloud

云手机 海外云手机 云手机海外版 国外云手机 电商云手机

Go 1.22 slices 库的更新:高效拼接、零化处理和越界插入优化

陈明勇

Go golang 后端 Go 1.22

从零开始的 dbt 入门教程 (dbt core 开发进阶篇)

不在线第一只蜗牛

软件开发 项目开发 dbt

C# 12 中新增的八大功能你都知道吗?

EquatorCoco

.net C语言 开发语言

收藏!如何有效实施DevOps?

敏捷开发

项目管理 DevOps 运维 单元测试 #后端

全彩LED显示屏选购指南

Dylan

产品 LED显示屏 全彩LED显示屏 led显示屏厂家

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