Java 中的垃圾收集:自 JDK 8 以来的进展
自 JDK 8 以来,Java 的垃圾收集 (GC) 经历了重大演变,解决了延迟、暂停时间和内存开销等常见挑战。本文探讨了这些进步,重点关注对开发人员从 JDK 8 等旧版本过渡到 JDK 17 和 JDK 21 等现代替代版本的实际影响。无论您是维护旧版应用程序还是规划未来的迁移,了解这些更新都至关重要。
要点
- 自 JDK 8 以来的改进:较新版本的 JDK 在内存管理和应用程序性能方面提供了显着增强。
- 了解 GC 选项:为您的应用程序选择正确的垃圾收集器可以优化行为和资源使用。
- 增量更新:分代 GC 模式和基于区域的堆布局等进步已经改变了垃圾收集,提供了更好的可扩展性和效率。
Java 中的垃圾收集 (GC) 可自动化内存管理,使开发人员无需处理低级细节。 GC 的两个主要目标是:
- 快速分配:Java 使用线程本地分配缓冲区 (TLAB) 进行快速、无同步的内存分配。
- 高效回收: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 |
G1 GC 作为 JDK 9 中的默认收集器引入,使用基于区域的堆布局并支持并发标记。这使得它可以在不停止应用程序线程的情况下确定活动性。通过将年轻代和老一代集合合并成更小的混合集合,G1 减少了暂停时间并提高了整体响应能力。
ZGC 专为超低延迟而设计,可以处理 TB 大小的堆,暂停时间在亚毫秒范围内。它与应用程序线程同时执行大部分工作,非常适合需要一致响应能力的应用程序,例如云服务或金融系统。
ZGC 分代模式(在 JDK 21 中引入)通过应用分代假设来分离短寿命和长寿命对象,进一步提高吞吐量。
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:亚毫秒级暂停。
由于记忆集和用于基于区域的集合的数据结构的优化,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中文网其他相关文章!

热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

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

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

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

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

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

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

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

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

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

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