首页 > Java > java教程 > Java 中的垃圾收集:自 JDK 8 以来的进展

Java 中的垃圾收集:自 JDK 8 以来的进展

Susan Sarandon
发布: 2025-01-04 05:03:40
原创
549 人浏览过

自 JDK 8 以来,Java 的垃圾收集 (GC) 经历了重大演变,解决了延迟、暂停时间和内存开销等常见挑战。本文探讨了这些进步,重点关注对开发人员从 JDK 8 等旧版本过渡到 JDK 17 和 JDK 21 等现代替代版本的实际影响。无论您是维护旧版应用程序还是规划未来的迁移,了解这些更新都至关重要。

要点

  1. 自 JDK 8 以来的改进:较新版本的 JDK 在内存管理和应用程序性能方面提供了显着增强。
  2. 了解 GC 选项:为您的应用程序选择正确的垃圾收集器可以优化行为和资源使用。
  3. 增量更新:分代 GC 模式和基于区域的堆布局等进步已经改变了垃圾收集,提供了更好的可扩展性和效率。

Java 中的垃圾收集 (GC) 可自动化内存管理,使开发人员无需处理低级细节。 GC 的两个主要目标是:

  1. 快速分配:Java 使用线程本地分配缓冲区 (TLAB) 进行快速、无同步的内存分配。
  2. 高效回收:GC 算法通过压缩和空闲列表等技术回收未使用的内存。

现代 Java GC 将堆分为两代:

  • 年轻代:存储短暂的对象,收集频繁但速度很快。
  • 老一代:存储在多个 GC 周期中存活下来的长寿命对象。

这种划分基于分代假设,该假设假设大多数对象都会在年轻时死亡,从而使年轻代收集比完整堆收集更有效。 Java 提供了多种 GC 算法,每种算法都针对特定用例量身定制:

垃圾收集器 焦点 用例 暂停时间 吞吐量 标题>
Garbage Collector Focus Use Case Pause Time Throughput
Serial GC Low memory overhead Small containers Medium Low
Parallel GC High throughput Batch processing or large datasets High High
G1 GC Balanced performance General-purpose, low-latency workloads Medium-Low Medium-High
ZGC Ultra-low latency Large-scale applications, low latency Sub-millisecond Medium
Shenandoah GC Low latency Large heaps, near-real-time processing Very low Medium
串行GC 内存开销低 小容器 中 低 并行GC 高吞吐量 批处理或大型数据集 高 高 G1 GC 平衡的性能 通用、低延迟工作负载 中低 中高 ZGC 超低延迟 大规模应用,低延迟 亚毫秒 中 谢南多厄GC 低延迟 大堆,近实时处理 非常低 中 表>

G1 GC 作为 JDK 9 中的默认收集器引入,使用基于区域的堆布局并支持并发标记。这使得它可以在不停止应用程序线程的情况下确定活动性。通过将年轻代和老一代集合合并成更小的混合集合,G1 减少了暂停时间并提高了整体响应能力。

Garbage Collection in Java: Progress Since JDK 8

ZGC 专为超低延迟而设计,可以处理 TB 大小的堆,暂停时间在亚毫秒范围内。它与应用程序线程同时执行大部分工作,非常适合需要一致响应能力的应用程序,例如云服务或金融系统。

ZGC 分代模式(在 JDK 21 中引入)通过应用分代假设来分离短寿命和长寿命对象,进一步提高吞吐量。

Garbage Collection in Java: Progress Since JDK 8

SPECjbb 2015 等基准测试表明,自 JDK 8 以来,现代 GC 算法在吞吐量和延迟方面都有显着改进:

  • 并行 GC:从 JDK 8 到 JDK 17,吞吐量提高了 30%。
  • G1 GC:从 JDK 8 到 JDK 17,吞吐量提高了 40% 以上。
  • ZGC:与 JDK 21 中的分代模式相比,提高了 10%。

减少暂停时间

所有收集器的暂停时间都已大幅减少:

  • 并行 GC:从 ~100ms 到 ~65ms。
  • G1 GC:从 JDK 8 到 JDK 17 减少了 40%。
  • ZGC:亚毫秒级暂停。

Garbage Collection in Java: Progress Since JDK 8

Garbage Collection in Java: Progress Since JDK 8

由于记忆集和用于基于区域的集合的数据结构的优化,G1 GC 显着减少了本机内存开销。从 JDK 8 到 JDK 17,G1 的本机内存使用量几乎减少了一半。为了更好地说明 GC 的实际应用,请考虑以下示例:

示例1:配置G1 GC

# Add these options to your JVM startup command
java -XX:+UseG1GC -XX:MaxGCPauseMillis=50 -Xmx2g -Xms2g -jar app.jar
登录后复制

此配置:

  • 激活 G1 GC。
  • 将目标最大暂停时间设置为 50 毫秒。
  • 分配 2GB 堆内存。

调整 ZGC 以实现低延迟应用

java -XX:+UseZGC -Xms4g -Xmx4g -XX:SoftRefLRUPolicyMSPerMB=50 -jar app.jar
登录后复制

此设置:

  • 使用 ZGC 实现超低延迟。
  • 分配 4GB 堆内存。
  • 调整软引用的生命周期以实现更好的内存管理。

迁移到 JDK 8 之外的挑战

虽然从 JDK 8 升级到更新版本(例如 JDK 17 或 21)可以带来显着的好处,但开发人员必须考虑:

  • 兼容性问题:某些库或框架可能无法完全支持较新的 JDK 版本。
  • 性能调优:每个 GC 都有特定的调优参数,可能需要调整这些参数才能获得最佳性能。
  • 暂存环境测试:在推出更改之前始终在非生产环境中进行彻底测试。

自 JDK 8 以来,Java 垃圾回收的进步非常显着。随着吞吐量、延迟和内存开销的显着改进,任何 Java 应用程序都需要升级到较新的 JDK 版本。

无论您运行小型容器还是大型云服务,都有针对您的用例进行优化的 GC 算法。因此,如果您仍在使用 JDK 8,那么是时候实现飞跃并享受现代 Java 的性能优势了。

有关更多信息,请观看来自 Devoxx 比利时的有关 Java 中的垃圾收集的视频:Stefan Johansson 自 JDK 8 以来的进展

以上是Java 中的垃圾收集:自 JDK 8 以来的进展的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板