Project Leyden 在 Java 24 中通过 JEP 483 提供了第三种更快的应用程序启动选项

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 缓存生成步骤

  1. 训练运行记录 AOT 配置:

    java -XX:AOTMode=record -XX:AOTConfiguration=app.aotconf -cp JavacBenchApp.jar JavacBenchApp 50
  2. 创建 AOT 缓存文件:

    java -XX:AOTMode=create -XX:AOTConfiguration=app.aotconf -XX:AOTCache=app.aot -cp JavacBenchApp.jar
  3. 使用 AOT 缓存文件:

    java -XX:AOTCache=app.aot -cp JavacBenchApp.jar JavacBenchApp 50

使用限制

  • 环境一致性:使用 AOT 缓存时,JDK 版本、操作系统、CPU 架构、类路径和 Java 模块选项必须与训练运行一致。
  • 不支持自定义类加载器:无法缓存用户自定义类加载器加载的类。
  • JVMTI 代理不兼容:无法与使用 ClassFileLoadHook 或调用 AddToBootstrapClassLoaderSearchAddToSystemClassLoaderSearch 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 的持续改进和框架的支持将推动这一技术的广泛应用。

阅读 57
0 条评论