JDK 25:JVM 与运行时更新#
版本信息
语言/库特性见 概览。ZGC 的分代演进脉络见 JDK 21 JVM 与运行时。
运行时主线#
JDK 25 的 JVM 更新围绕「更省内存 + 更快启动 + GC 收尾」三件事:Compact Object Headers 把每个对象的头压到 64 位、新 AOT 体系加速启动、ZGC 完成分代化、Generational Shenandoah 转正。
ZGC:分代化收尾#
JDK 21 中分代 ZGC 还是可选的(需 -XX:+ZGenerational)。JDK 23(JEP 474)弃用非分代模式,JDK 24(JEP 490)移除非分代(JDK 25 LTS 承接)——ZGC 现在只有分代一种:
java -XX:+UseZGC -Xmx16g -jar app.jar # JDK 25:即分代(无需 -XX:+ZGenerational)
本机实测(JDK 25):-XX:+UseZGC 的 GC bean 为 ZGC Minor Cycles / Minor Pauses / Major Cycles / Major Pauses;连 -XX:-ZGenerational(显式关闭分代)也仍得到分代 bean——非分代已被移除,该标志不再有效果。
graph LR
A["JDK 21<br/>分代可选"] --> B["JDK 23<br/>弃用非分代(JEP 474)"]
B --> C["JDK 24<br/>移除非分代(JEP 490)"]
style A fill:#fff9c4
style C fill:#c8e6c9
Compact Object Headers(JEP 519)#
每个 Java 对象都带一个对象头(mark word + class pointer)。64 位 JVM 上,原本头部约 96–128 位(12–16 字节)。Compact Object Headers 把它压到 64 位(8 字节),对大量小对象的堆,内存占用可降 10%–20%。
本机实测:JDK 25 中 UseCompactObjectHeaders 默认关闭,需显式开启:
java -XX:+UseCompactObjectHeaders -jar app.jar
不同发行版默认可能不同;本机 OpenJDK 25 默认关闭。开启前建议按你的对象分布做基准测试。
Ahead-of-Time(JEP 515 / 514)#
JDK 25 引入新的 AOT 体系(非早期已被移除的 jaotc):
- JEP 515 AOT Method Profiling:把方法的运行时 profile 提前采集,落到 AOT 缓存。
- JEP 514 AOT Command-Line Ergonomics:让 JVM 自动发现并复用这份 profile,无需复杂命令行。
本机实测相关标志存在:-XX:AOTCache、-XX:AOTMode、-XX:AOTConfiguration、-XX:AOTClassLinking。目标是缩短启动时间(把"启动后才能学到的 JIT 知识"提前固化),利好短生命周期/云原生场景。
其他运行时更新#
| 特性 | JEP | 说明(本机实测/官方) |
|---|---|---|
| Generational Shenandoah 转正 | 521 | 从 JDK 24 实验(JEP 404)毕业为产品级;本机构建不含 Shenandoah(发行版差异) |
| JFR CPU-Time Profiling | 509 | JFR 新增 CPU 时间采样(实验特性) |
| JFR Cooperative Sampling | 518 | 协作式采样,减少 profiling 对应用的偏差/开销 |
| 移除 32 位 x86 端口 | 503 | 不再为 32 位 Windows/Linux x86 构建;聚焦 64 位 |
与 JDK 8 / 21 对比#
java -jar app.jar # 默认 Parallel;对象头 12–16B;无 AOT
java -XX:+UseZGC -XX:+ZGenerational -jar app.jar # 分代需显式开
java -XX:+UseZGC -XX:+UseCompactObjectHeaders -jar app.jar
常见坑 / 最佳实践#
- 非分代 ZGC 没了:升级到 JDK 25 后,若脚本里还写着
-XX:-ZGenerational,标志会被接受但不生效;清理掉即可。 - Compact Object Headers 不是免费午餐:它压缩了锁/hashCode 等信息的位置,极端场景(重度使用偏向锁、特定 native 交互)需基准验证;默认关就是为此留缓冲。
- 新 AOT 需要先采集:515/514 的收益依赖"先跑一遍产生 profile,再复用";冷启动单次跑看不到效果,要在 CI/部署流水线里固化 profile。
- Shenandoah 看发行版:要用 Generational Shenandoah 需选 Red Hat 系等构建;Oracle/本机构建没有。
小结#
JDK 25 在 JVM 层是「把前面几版铺的路收口」:ZGC 分代化收尾、新 AOT 与 Compact Object Headers 攻启动开销与内存占用、JFR 持续增强。叠加转正的语言特性(实例 main、弹性构造器、Scoped Values),JDK 25 成为继 17、21 之后又一个"全面体"的 LTS。