Java ZGC垃圾回收器怎么用?ZGC在Java中的配置和性能优化?

文章导读
Previous Quiz Next 什么是 ZGC? ZGC 代表 Z Garbage Collector。Z Garbage Collector,即 ZGC,于 Java 11 中引入,作为一种低延迟的垃圾回收机制。由于开发者社区认为其过于复杂而未能在早期发布,ZGC
📋 目录
  1. 什么是 ZGC?
  2. Z Garbage Collector 的特性
  3. 使用旧式的垃圾回收方式
A A

Java - Z 垃圾收集器 (ZGC)



Previous
Quiz
Next

什么是 ZGC?

ZGC 代表 Z Garbage Collector。Z Garbage Collector,即 ZGC,于 Java 11 中引入,作为一种低延迟的垃圾回收机制。由于开发者社区认为其过于复杂而未能在早期发布,ZGC 在 Java 11 中作为实验性功能引入。ZGC 确保垃圾回收的暂停时间不依赖于 heap 大小,无论 heap 大小是 2MB 还是 2GB,暂停时间都不会超过 10 ms。

但是,与其他 HotSpot VM GC(如 G1 和 Shenandoah)类似,ZGC 在将未使用的 heap 内存返回给操作系统方面存在限制。

Java 15 将 ZGC,即 Z Garbage Collector 提升为标准功能。在此之前,它一直是实验性功能。它是一种低延迟、高可扩展性的垃圾收集器。

ZGC 性能极高,即使在处理海量数据应用(如机器学习应用)时也能高效运行。它确保在处理数据时不会因垃圾回收而出现长时间暂停。它支持 Linux、Windows 和 macOS。

Z Garbage Collector 的特性

从 Java 16 开始,ZGC 的 Thread-Stack 处理从 Safepoints 移至 Concurrent Phase,大幅提升了效率。此后,对垃圾回收进行了以下增强,例如:

  • ZGC 在达到最大 heap 大小之前,默认将未提交的内存返回给操作系统。

  • ZGC 在减少内存占用 footprint 的同时提升性能。

  • ZGC 现在支持 16 TB 的 heap 大小,而之前的限制是 4TB。

  • Thread-stack 处理从 ZGC safepoints 中移出。

  • Stack 处理改为 lazy、cooperative、concurrent 和 incremental。

  • 所有其他 per-thread root 处理从 ZGC safepoints 中移除。

  • HotSpot 子系统可以 lazy 处理 stacks。

  • Concurrent class unloading

  • 未使用内存的 uncommiting

  • 支持 Class Data Sharing

  • NUMA Awareness

  • Multithreaded Heap Pre-touch

  • 最大 Heap 大小限制从 4 TB 增加到 16 TB。

使用旧式的垃圾回收方式

为了回退到 Java 11 的垃圾回收方式,可以使用以下选项:

  • 使用 -XX:-ZUncommit 选项

  • 将 -Xms 和 -Xmx 的 heap 大小设置为相同。