|
对于最新稳定版本,请使用 Spring Framework 7.0.6! |
CDS
类数据共享(Class Data Sharing,CDS)是一项JVM 特性, 有助于减少 Java 应用程序的启动时间和内存占用。
要使用此功能,应为应用程序的特定类路径创建一个 CDS 归档文件。Spring 框架提供了一个钩子点,以简化该归档文件的创建。一旦归档文件准备就绪,用户应通过 JVM 参数选择启用它。
创建 CDS 归档
应用程序退出时可以创建其 CDS(类数据共享)归档文件。Spring 框架提供了一种运行模式,在该模式下,一旦 ApplicationContext 刷新完成,进程便会自动退出。在此模式中,所有非延迟初始化的单例 Bean 都已被实例化,并且已调用 InitializingBean#afterPropertiesSet 回调方法;但此时生命周期尚未启动,ContextRefreshedEvent 事件也尚未发布。
要创建该归档文件,必须指定两个额外的 JVM 标志:
-
-XX:ArchiveClassesAtExit=application.jsa:在退出时创建 CDS 存档 -
-Dspring.context.exit=onRefresh:启动您的 Spring 应用程序,然后立即退出,如上所述。
要创建 CDS 存档,您的 JDK/JRE 必须包含一个基础镜像。如果您将上述标志添加到启动脚本中,可能会收到类似如下的警告:
-XX:ArchiveClassesAtExit is unsupported when base CDS archive is not loaded. Run with -Xlog:cds for more info.
基础 CDS 归档文件通常开箱即用,但如有需要,也可以通过执行以下命令来创建:
$ java -Xshare:dump
使用归档
一旦归档文件可用,请在启动脚本中添加 -XX:SharedArchiveFile=application.jsa 以使用它,前提是工作目录中存在一个 application.jsa 文件。
要检查 CDS 缓存是否生效,可以使用(仅用于测试目的,不可在生产环境中使用)-Xshare:on,如果无法启用 CDS,该选项会打印一条错误信息并退出。
要了解缓存的有效性,可以通过添加一个额外的参数来启用类加载日志:-Xlog:class+load:file=cds.log。这将生成一个 cds.log 文件,其中记录了每次尝试加载类及其来源的信息。从缓存中加载的类应显示其来源为“shared objects file”(共享对象文件),如下例所示:
[0.064s][info][class,load] org.springframework.core.env.EnvironmentCapable source: shared objects file (top)
[0.064s][info][class,load] org.springframework.beans.factory.BeanFactory source: shared objects file (top)
[0.064s][info][class,load] org.springframework.beans.factory.ListableBeanFactory source: shared objects file (top)
[0.064s][info][class,load] org.springframework.beans.factory.HierarchicalBeanFactory source: shared objects file (top)
[0.065s][info][class,load] org.springframework.context.MessageSource source: shared objects file (top)
如果无法启用 CDS,或者你有大量类未从缓存中加载,请确保在创建和使用归档文件时满足以下条件:
-
必须使用同一个 JVM。
-
类路径必须指定为 JAR 文件列表,避免使用目录和
*通配符。 -
必须保留 JAR 文件的时间戳。
-
使用归档文件时,类路径必须与创建该归档文件时所用的类路径完全相同,且顺序一致。 可以在末尾指定额外的 JAR 文件或目录(但不会被缓存)。