自 JDK 8 以来,Java 的垃圾收集 (GC) 经历了重大演变,解决了延迟、暂停时间和内存开销等常见挑战。本文探讨了这些进步,重点关注对开发人员从 JDK 8 等旧版本过渡到 JDK 17 和 JDK 21 等现代替代版本的实际影响。无论您是维护旧版应用程序还是规划未来的迁移,了解这些更新都至关重要。
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 算法在吞吐量和延迟方面都有显着改进:
所有收集器的暂停时间都已大幅减少:
由于记忆集和用于基于区域的集合的数据结构的优化,G1 GC 显着减少了本机内存开销。从 JDK 8 到 JDK 17,G1 的本机内存使用量几乎减少了一半。为了更好地说明 GC 的实际应用,请考虑以下示例:
# Add these options to your JVM startup command java -XX:+UseG1GC -XX:MaxGCPauseMillis=50 -Xmx2g -Xms2g -jar app.jar
此配置:
java -XX:+UseZGC -Xms4g -Xmx4g -XX:SoftRefLRUPolicyMSPerMB=50 -jar app.jar
此设置:
虽然从 JDK 8 升级到更新版本(例如 JDK 17 或 21)可以带来显着的好处,但开发人员必须考虑:
自 JDK 8 以来,Java 垃圾回收的进步非常显着。随着吞吐量、延迟和内存开销的显着改进,任何 Java 应用程序都需要升级到较新的 JDK 版本。
无论您运行小型容器还是大型云服务,都有针对您的用例进行优化的 GC 算法。因此,如果您仍在使用 JDK 8,那么是时候实现飞跃并享受现代 Java 的性能优势了。
有关更多信息,请观看来自 Devoxx 比利时的有关 Java 中的垃圾收集的视频:Stefan Johansson 自 JDK 8 以来的进展
?
以上是Java 中的垃圾收集:自 JDK 8 以来的进展的详细内容。更多信息请关注PHP中文网其他相关文章!