Java 24 及 JEP 483 全面总结
主要观点
Java 24 中的 JEP 483,即“提前加载与链接(Ahead-of-Time Class Loading & Linking)”,是 Project Leyden 的一部分,旨在通过构建缓存文件来加速 Java 应用程序的启动速度,最高可达 40%。该技术无需代码变更或引入新的应用约束。
关键信息
JEP 483 的核心改进
- Class-Data Sharing (CDS) 扩展:JEP 483 扩展了 Java 的 CDS 功能,不仅缓存类的读取和解析结果,还将加载和链接的类也加入缓存,称为“AOT 缓存”。
- 训练运行:需要一次训练运行来记录 AOT 配置,随后生成 AOT 缓存文件。
- 使用 AOT 缓存:生成的 AOT 缓存文件可以显著加速应用程序的启动,尤其是在加载大量类的情况下,效果更为明显。
性能提升
- Spring PetClinic:启动速度提升高达 40%。
- Helidon:Helidon SE 和 Helidon MP 的启动速度分别提升 67% 和 62%。
- Apple M1 MacBook Pro:使用 23 MB 的 AOT 缓存文件,启动速度提升 26%。
技术对比
- GraalVM Native Image:启动速度提升 95-99%,但面临更多约束。
- CRaC:通过内存快照加速启动,但仅支持 Linux,且需要关闭文件与网络连接。
重要细节
AOT 缓存生成步骤
训练运行记录 AOT 配置:
java -XX:AOTMode=record -XX:AOTConfiguration=app.aotconf -cp JavacBenchApp.jar JavacBenchApp 50
创建 AOT 缓存文件:
java -XX:AOTMode=create -XX:AOTConfiguration=app.aotconf -XX:AOTCache=app.aot -cp JavacBenchApp.jar
使用 AOT 缓存文件:
java -XX:AOTCache=app.aot -cp JavacBenchApp.jar JavacBenchApp 50
使用限制
- 环境一致性:使用 AOT 缓存时,JDK 版本、操作系统、CPU 架构、类路径和 Java 模块选项必须与训练运行一致。
- 不支持自定义类加载器:无法缓存用户自定义类加载器加载的类。
- JVMTI 代理不兼容:无法与使用
ClassFileLoadHook
或调用AddToBootstrapClassLoaderSearch
和AddToSystemClassLoaderSearch
API 的 JVMTI 代理一起工作。
未来展望
- Project Leyden:计划进一步改进,可能合并 AOT 缓存生成的两个步骤。
- Quarkus:已支持 JEP 483,并致力于解决训练运行的复杂性和内存消耗问题。
- Spring:Spring Boot 已支持 CDS,未来将进一步优化。
框架支持
- Helidon:提供了 JEP 483、CRaC 和 GraalVM Native Image 的基准测试结果。
- Quarkus:支持 JEP 483,并提供了简化的 AOT 缓存生成方式。
- Spring:Spring 团队对 JEP 483 的引入表示兴奋,并期待未来的进一步改进。
- Micronaut:尚未回应。
总结
JEP 483 通过引入 AOT 缓存,显著提升了 Java 应用程序的启动速度,尤其对 Spring Boot 等框架有显著效果。尽管存在一些使用限制,但 Project Leyden 的持续改进和框架的支持将推动这一技术的广泛应用。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。