从0.031秒优化0.018秒,JEP 483为Java应用带来的启动加速黑科技

大家好,我是哪吒。

近期给大家带来JDK24相关的文章,坚持学习,持续进步,加油!

一、JEP 483 提前加载与链接类

JEP 483,名为"提前加载与链接类",是 Java 24 引入的一项功能,**旨在通过在 HotSpot JVM 启动时让类的加载和链接状态立即可用来缩短启动时间。**它通过监控应用程序的一次训练运行来记录使用的类,然后创建缓存供后续运行使用,从而实现这一目标。

这项功能特别适用于启动时间至关重要的应用程序,例如网络服务、桌面应用等。通过提前加载和链接类,应用程序启动时无需等待动态加载和链接,从而提升用户体验和效率。

二、在Java 17基础上优化了什么?

在 Java 17 中,类数据共享(CDS)功能通过共享类元数据来加速启动,但类加载和链接仍发生在运行时。JEP 483 在 Java 24 中进一步优化,不仅共享元数据,还提前加载和链接类,使启动时间比 Java 17 更短。

CDS 允许多个 JVM 实例共享只读的类元数据,减少了每次启动时解析和验证类文件的开销。

然而,CDS 主要加速了类加载过程,类的实际加载和链接仍发生在运行时,依赖于首次使用。

相比之下,JEP 483 在 Java 24 中扩展了 CDS 的功能:

不仅共享元数据,还提前加载和链接类,使它们在 JVM 启动时已处于可用状态。

例如,性能示例显示简单应用如 HelloStream 启动时间从 0.031 秒减少到 0.018 秒,改善了 42%,缓存大小为 11.4 MB。

这一提升意味着 Java 24 的应用程序在启动时无需动态加载和链接类,从而进一步缩短了启动时间。

三、透过现象看本质

使用命令如 java -XX:AOTMode=record -XX:AOTConfiguration=app.aotconf -cp app.jar com.example.App ... 监控应用程序,记录加载和链接的类。

基于训练运行的结果,使用 java -XX:AOTMode=create -XX:AOTConfiguration=app.aotconf -XX:AOTCache=app.aot -cp app.jar创建提前加载和链接的缓存。

在后续运行中,使用 java -XX:AOTCache=app.aot -cp app.jar com.example.App ... 加载缓存,使类提前准备好。

四、实现细节与限制

使用相同的 JDK 版本、硬件架构(如 x64 或 aarch64)和操作系统。类路径必须使用 JAR 文件,不支持目录,模块选项(如 -m、--module-path)也需保持一致。

当前不支持 ZGC、用户定义的类加载器加载的类、旧字节码验证器和签名类(在这些情况下会回退到即时加载和链接)。

提供 -XX:AOTMode=on检查配置,-XX:AOTMode=off禁用,-XX:AOTMode=auto为默认行为。

五、适用场景

通过提前加载和链接类,JEP 483 减少了这些延迟,使应用程序能够更快地进入可用状态。此外,它还为未来的启动和预热时间优化奠定了基础,例如计划支持用户定义的类加载器和 ZGC。

JEP 483 主要针对 Java 应用程序启动时间慢的问题:

1、**类数量多:**大型应用程序可能需要加载数千个类文件,动态加载会导致显著延迟。

2、**依赖复杂:**复杂的类依赖关系可能导致启动过程中的多次加载和链接操作。

3、**用户体验:**对于桌面应用或网络服务,慢启动可能影响用户满意度。

4、**网络服务:**如 Spring PetClinic,性能示例显示启动时间从 4.486 秒减少到 2.604 秒,改善了 42%。

5、**桌面应用:**用户期望快速启动的软件,如 IDE 或工具。

六、性能测试

以下是 JEP 483 的性能示例,展示了与 JDK 23 的对比:

程序 JDK 23 时间 (秒) AOT 缓存时间 (秒) 改善比例 缓存大小 (MB)
HelloStream 0.031 0.018 42% 11.4
Spring PetClinic 4.486 2.604 42% 130

这些数据表明,对于不同规模的应用程序,JEP 483 都能显著缩短启动时间,缓存大小与应用程序复杂度相关。

七、结论

**JEP 483 是 Java 24 中的一项重要功能,通过提前加载和链接类显著缩短了应用程序的启动时间。**相比 Java 17 的 CDS,它提供了更深层次的优化,特别适用于启动时间敏感的场景。尽管存在一些限制,但其潜力已被社区广泛认可,并为未来的性能提升奠定了基础。

相关推荐
8Qi81 分钟前
Redis哨兵模式(Sentinel)深度解析
java·数据库·redis·分布式·缓存·sentinel
wangchunting8 分钟前
数据结构-树
java·数据结构
无籽西瓜a11 分钟前
【西瓜带你学设计模式 | 第五期 - 建造者模式】建造者模式 —— 产品构建实现、优缺点与适用场景及模式区别
java·后端·设计模式·软件工程·建造者模式
wzl2026121314 分钟前
《基于企微会话存档的精准发送策略:从互动数据分析到防折叠群发》
java·数据分析·企业微信
xhuiting38 分钟前
MySQL专题总结(四)—— 高可用
java·数据库·mysql
不吃蘑菇!41 分钟前
LeetCode Hot 100-1(两数之和)
java·数据结构·算法·leetcode·哈希表
小江的记录本1 小时前
【Spring注解】Spring生态常见注解——面试高频考点总结
java·spring boot·后端·spring·面试·架构·mvc
qqacj1 小时前
SpringBoot3.3.0集成Knife4j4.5.0实战
java
煎饼皮皮侠1 小时前
利用 AQS 构建一个自己的公平共享锁
java·aqs·公平共享锁
梁山话事人1 小时前
Spring IOC
java·数据库·spring