Java 21 中的 Generational ZCG

10 Sept 2024 | 4 分钟阅读

垃圾回收是现代编程语言中内存管理的一个关键方面,Java 也不例外。Java 的垃圾回收器 (GC) 通过回收不再使用的对象来自动管理内存。在 Java 21 中,垃圾回收过程得到了显著改进,尤其是在代际垃圾回收方面。

代际垃圾回收

代际垃圾回收是一种内存管理策略,其基础是大多数对象在生命周期很短的观察结果。在典型的 Java 应用程序中,大部分对象在创建后不久就变得不可达。这一观察结果催生了代际垃圾回收方法的创建。

在 Java 中,堆被划分为两个主要代:年轻代和老年代。

  • 年轻代: 这是 GC 中分配新创建对象的部分。它进一步划分为 Eden 区和两个幸存区 (S0 和 S1)。在年轻代垃圾回收周期中存活的对象将被提升到老年代。
  • 老年代: 这是 GC 中存放长生命周期对象的部分。与年轻代相比,老年代的垃圾回收频率较低。

Java 21 中的增强功能

Java 21 为代际垃圾回收带来了显著的改进,旨在使内存管理更加高效和响应迅速。一些关键的增强功能包括:

1. ZGC (Z 垃圾回收器) 更新

ZGC 引入于 Java 11,是一个可扩展的垃圾回收器,旨在以低延迟要求处理非常大的堆(数 TB)。在 Java 21 中,ZGC 经过了进一步的优化,以提高其性能和对各种工作负载的适应性。

2. 改进的自适应大小调整

Java 21 引入了更复杂的算法来动态调整不同堆区域的大小。这意味着垃圾回收器可以更好地适应应用程序的内存使用模式,从而实现更高效的内存利用。

3. 增强的大对象处理

现在可以更有效地管理大于特定阈值的大对象。Java 21 提供了处理大对象的机制,以最大程度地减少性能开销。

4. 优化的提升失败处理

当年轻代中的对象无法提升到老年代时,就被视为提升失败。Java 21 包含优化措施,以减少提升失败的影响,从而实现更平滑的垃圾回收周期。

5. 精细调整的人体工程学

Java 21 结合了改进的启发式算法,可以根据系统配置和工作负载特性自动选择垃圾回收器设置。这有助于最大限度地减少手动调整的需求。

增强的代际垃圾回收的好处

Java 21 中代际垃圾回收的改进为开发人员和应用程序带来了多项好处:

  • 降低延迟: 增强功能可缩短垃圾回收暂停时间,使 Java 应用程序更具响应性,并适用于实时系统。
  • 提高可伸缩性: ZGC 的更新使 Java 能够高效地处理更大的堆,使其成为内存密集型应用程序的有力选择。
  • 更好的资源利用: 自适应大小调整算法确保内存得到更有效地使用,减少浪费并优化性能。
  • 更平滑的性能: 提升失败处理中的优化有助于实现更平滑的垃圾回收周期,从而获得更一致的应用程序性能。

它引入了一种更复杂的方法,该方法可以同时运行两个垃圾回收器,并采用显式代码来处理加载和存储障碍。通过新系统,不再使用多映射内存,使用户可以更轻松地监控堆内存利用率,并可能允许比非代际 ZGC 的 16 TB 限制更大的最大堆大小。利用诸如快速路径和慢速路径、记住集障碍、SATB 标记障碍、融合存储障碍检查和存储障碍缓冲区等技术来优化加载和存储障碍。

代际 ZGC 中双缓冲记住集以及在不使用额外堆内存的情况下进行重定位的能力的引入,进一步实现了有效的年轻代收集。该系统还能很好地管理大对象,将其分配到年轻代,如果它们具有较长的生命周期,则将它们提升到老年代。老年代对象图的根被完整垃圾回收器视为从新代中的项到老年代中对象的指针。

代际垃圾回收长期以来一直是 Java 内存管理策略的基石。随着 Java 21 中引入的进步,垃圾回收器比以往任何时候都更高效、更具响应性。这些增强功能与 Z 垃圾回收器的强大功能相结合,使 Java 21 成为各种应用程序的有力选择,包括那些对延迟要求严格和内存占用巨大的应用程序。随着开发人员继续利用这些改进,我们可以预期 Java 应用程序将展现出更好的性能和响应能力。