3 月 22 日,JDK 18发布。对于 ZGC 来说,这是一个相当安静的版本,因为我们在过去一年左右的大部分时间里都致力于使 ZGC 成为一代代 GC。尽管如此,在此版本中仍有 37个 与 ZGC 相关的错误修复和增强功能。我将在这篇文章中讨论一些更有趣的内容。如果您有兴趣了解有关以前 JDK 版本中 ZGC 功能/增强功能的更多信息,请查看我以前的一些帖子。
现在让我们谈谈 JDK 18 中的新功能(从 ZGC 的角度来看)。
字符串重复数据删除
字符串重复数据删除是一个 JVM 特性 ( -XX:+UseStringDeduplication),它已经存在了很长一段时间。它通过自动删除支持 String 对象的相同字符数组来帮助减少 Java 堆内存使用量。例如,如果堆上存在两个 String 对象,并且它们都指向包含字符“Java”的后备数组,则其中一个 String 对象将被修改,以便两个 String 对象指向同一个数组,而另一个数组将变得无法访问并受到垃圾收集。对于某些应用程序,这可以帮助减少相当多的堆内存使用量,因为 String 对象可以占用 Java 堆的重要部分,并且在这些对象中查找重复项是相当普遍的。
我在 2014 年编写了JEP和该功能的初始实现,它作为 JDK 8u20 的一部分发布。这是在 ZGC 诞生之前,最初的实现只是在 G1 垃圾收集器中增加了对字符串去重的支持。
快进到 2021 年。Kim Barrett彻底检修 了 String 重复数据删除基础架构的重要部分。总体概念保持不变,但字符串重复数据删除机制与垃圾收集器的接口方式变得更加通用。这使得该功能更容易集成到 G1 以外的垃圾收集器中。结果,字符串重复数据删除支持后来被添加到SerialGC、 ParallalGC和ZGC。
如果您不熟悉字符串重复数据删除、它的实际作用以及何时可能想要启用它,请查看 JEP。即使该文档现在有点过时(例如,它只讨论 G1),该功能的要点仍然是相同的。
类卸载问题已修复
我们收到了一份关于 ZGC 邮件列表中的性能问题的报告。事实证明,这是一个 10 年前的错误,可以追溯到 PermGen的删除。
因此,大约 10 年前,移除 PermGen的补丁对处理内联缓存清理的函数进行了一些更改。内联缓存是 JVM 用来加速 Java 中的方法调用的一种推测性优化技术。当 GC 卸载未使用的类和已编译的方法时,需要清理一些 Inline Cache,以便它们不再引用任何卸载的实体。
事实证明,这个补丁包含一个小而重要的编辑错误,其中缩进和范围混淆了。只看补丁很难发现这个错误,因为有问题的代码也被移动了。这个错误导致一些内联缓存被错误地清理。但是,不正确的清理并没有导致任何明显的问题,例如 JVM 崩溃。相反,它引发了一个恶性循环,GC 和 Java 线程在如何清理这些缓存方面存在分歧并争执不休。最终结果是,在某些条件下,类卸载可能需要很长时间才能完成。由于问题的根本原因是 GC 和并发运行的 Java 线程之间的不良交互,它只影响了进行并发类卸载的 GC(例如 ZGC)。执行 Stop-the-World 类卸载的 GC(例如 SerialGC,
幸运的是,一旦发现了这个问题,修复就很 简单了。如果您对更多详细信息感兴趣,可以在相应的 拉取请求中阅读所有相关信息。
此修复也向后移植到 JDK 17.0.2。
Linux/PowerPC 支持
早在 2013 年,即在 ZGC 成立之前,JEP 175的创建是为了将 Linux/PowerPC(以及 AIX/PowerPC)支持引入 OpenJDK。初始端口作为 JDK 8u20 的一部分发布,并一直保持至今。支持这个平台的努力从一开始就由我们在SAP的朋友资助。
因此,听说 SAP 也贡献了补丁以使 ZGC 在 Linux/PowerPC 上可用,这可能并不令人惊讶。添加对新 CPU 架构的支持主要是在解释器和两个 JIT 编译器中实现 ZGC 的各种屏障(负载屏障、nmethod 入口屏障和堆栈水印屏障)。补丁的重量约为 1200 行代码。
从 JDK 18 开始,ZGC 现在可以在以下平台上运行( 有关详细信息,请参阅此表):
- Linux/x64
- Linux/AArch64
- Linux/PowerPC
- macOS/x64
- macOS/AArch64
- 视窗/x64
- 视窗/AArch64
概括
- -XX:+UseStringDeduplication现在支持JVM 选项。此功能(默认禁用)告诉 ZGC 查找和去重支持 String 对象的相同字符数组,以减少整体堆内存使用。
- 修复了一个存在 10 年之久的错误,该错误有时会导致类卸载需要很长时间。
- ZGC 现在可以在 Linux/PowerPC 上运行,这要感谢 SAP 的人。
如若转载,请注明出处:https://www.daxuejiayuan.com/4957.html