|
此版本仍在开发中,尚未稳定。如需最新的稳定版本,请使用 Spring Framework 7.0.6! |
JVM AOT 缓存
即时编译缓存是通过 JEP 483 在 Java 24 中引入的 JVM 功能,有助于减少 Java 应用程序的启动时间和内存占用。AOT 缓存是 类数据共享(Class Data Sharing, CDS) 的自然演进。 Spring 框架同时支持 CDS 和 AOT 缓存,如果正在使用的 JVM 版本支持(Java 24 及以上),建议使用 AOT 缓存。
为了使用此功能,需要为应用程序的特定类路径创建一个AOT缓存。可以在部署的实例上创建此缓存,或者在例如打包应用程序时进行的训练运行期间创建,这得益于Spring框架提供的钩子点,以便于此类用例。一旦缓存可用,用户应通过JVM标志选择启用它。
| 如果您正在使用Spring Boot,强烈建议利用其 可执行JAR解包支持 ,该功能旨在满足AOT缓存和CDS的类加载需求。 |
创建缓存
通常,AOT缓存可以在应用程序退出时创建。Spring框架提供了一种操作模式,其中进程在
ApplicationContext 刷新后可以自动退出。在这种模式下,所有非延迟初始化的单例已被实例化,并且
InitializingBean#afterPropertiesSet 回调已被调用;但生命周期尚未启动,ContextRefreshedEvent 还没有被发布。
在训练运行期间创建缓存,可以通过指定 -Dspring.context.exit=onRefresh JVM 参数来启动,并在
ApplicationContext 刷新后退出Spring应用程序:
-
AOT cache (Java 25+)
-
AOT cache (Java 24)
-
CDS
java -XX:AOTCacheOutput=app.aot -Dspring.context.exit=onRefresh -jar application.jar ...
# Both commands need to be run with the same classpath
java -XX:AOTMode=record -XX:AOTConfiguration=app.aotconf -Dspring.context.exit=onRefresh ...
java -XX:AOTMode=create -XX:AOTConfiguration=app.aotconf -XX:AOTCache=app.aot ...
# To create a CDS archive, your JDK/JRE must have a base image
java -XX:ArchiveClassesAtExit=app.jsa -Dspring.context.exit=onRefresh ...
使用Java 25+时,AOT缓存除其他内容外,还会存储
方法分析信息。因此,为了利用这一功能,
建议为经历过类似生产环境工作流程的部分应用创建AOT缓存,
而不是使用旨在仅优化应用启动速度的-Dspring.context.exit=onRefresh标志。 |
使用缓存
一旦缓存文件创建完成,您可以使用它来更快地启动应用程序。
-
AOT cache
-
CDS
# With the same classpath (or a superset) tan the training run
java -XX:AOTCache=app.aot ...
# With the same classpath (or a superset) tan the training run
java -XX:SharedArchiveFile=app.jsa ...
注意查看日志和启动时间,以检查AOT缓存是否成功使用。
为了确定缓存的有效性,您可以通过添加一个额外的属性:-Xlog:class+load:file=aot-cache.log,来启用类加载日志。这会在每次尝试加载类及其源时创建一个aot-cache.log。从缓存中加载的类应该具有“共享对象文件”作为来源,如下例所示:
[0.151s][info][class,load] org.springframework.core.env.EnvironmentCapable source: shared objects file
[0.151s][info][class,load] org.springframework.beans.factory.BeanFactory source: shared objects file
[0.151s][info][class,load] org.springframework.beans.factory.ListableBeanFactory source: shared objects file
[0.151s][info][class,load] org.springframework.beans.factory.HierarchicalBeanFactory source: shared objects file
[0.151s][info][class,load] org.springframework.context.MessageSource source: shared objects file
如果AOT缓存无法启用,或者您有大量的类不是从缓存中加载的,请确保在创建和使用缓存时满足以下条件:
-
必须使用完全相同的JVM。
-
类路径必须指定为JAR或一系列JAR,避免使用目录和
*通配符字符。 -
JAR 文件的时间戳必须保留。
-
在使用缓存时,类路径必须与创建它时使用的路径相同,且顺序一致。 可以在末尾指定额外的JAR文件或目录(但这些不会被缓存)。