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

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

Jan 04, 2025 am 05:03 AM

自 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中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1664
14
CakePHP 教程
1421
52
Laravel 教程
1315
25
PHP教程
1266
29
C# 教程
1239
24
公司安全软件导致应用无法运行?如何排查和解决? 公司安全软件导致应用无法运行?如何排查和解决? Apr 19, 2025 pm 04:51 PM

公司安全软件导致部分应用无法正常运行的排查与解决方法许多公司为了保障内部网络安全,会部署安全软件。...

如何将姓名转换为数字以实现排序并保持群组中的一致性? 如何将姓名转换为数字以实现排序并保持群组中的一致性? Apr 19, 2025 pm 11:30 PM

将姓名转换为数字以实现排序的解决方案在许多应用场景中,用户可能需要在群组中进行排序,尤其是在一个用...

如何使用MapStruct简化系统对接中的字段映射问题? 如何使用MapStruct简化系统对接中的字段映射问题? Apr 19, 2025 pm 06:21 PM

系统对接中的字段映射处理在进行系统对接时,常常会遇到一个棘手的问题:如何将A系统的接口字段有效地映�...

IntelliJ IDEA是如何在不输出日志的情况下识别Spring Boot项目的端口号的? IntelliJ IDEA是如何在不输出日志的情况下识别Spring Boot项目的端口号的? Apr 19, 2025 pm 11:45 PM

在使用IntelliJIDEAUltimate版本启动Spring...

Java对象如何安全地转换为数组? Java对象如何安全地转换为数组? Apr 19, 2025 pm 11:33 PM

Java对象与数组的转换:深入探讨强制类型转换的风险与正确方法很多Java初学者会遇到将一个对象转换成数组的�...

如何优雅地获取实体类变量名构建数据库查询条件? 如何优雅地获取实体类变量名构建数据库查询条件? Apr 19, 2025 pm 11:42 PM

在使用MyBatis-Plus或其他ORM框架进行数据库操作时,经常需要根据实体类的属性名构造查询条件。如果每次都手动...

电商平台SKU和SPU数据库设计:如何兼顾用户自定义属性和无属性商品? 电商平台SKU和SPU数据库设计:如何兼顾用户自定义属性和无属性商品? Apr 19, 2025 pm 11:27 PM

电商平台SKU和SPU表设计详解本文将探讨电商平台中SKU和SPU的数据库设计问题,特别是如何处理用户自定义销售属...

如何利用Redis缓存方案高效实现产品排行榜列表的需求? 如何利用Redis缓存方案高效实现产品排行榜列表的需求? Apr 19, 2025 pm 11:36 PM

Redis缓存方案如何实现产品排行榜列表的需求?在开发过程中,我们常常需要处理排行榜的需求,例如展示一个�...

See all articles