CDS
类数据共享 (CDS) 是一种 JVM feature,可帮助减少 Java 应用程序的启动时间和内存占用。 要使用该功能,应为应用程序的特定类路径创建 CDS 存档。Spring 框架提供一个挂接点来简化存档的创建。存档可用后,用户应通过 JVM 标志选择使用它。
Creating the CDS Archive
可以在应用程序退出时创建应用程序的 CDS 存档。Spring 框架提供一种操作模式,即一旦 ApplicationContext
刷新,进程可以自动退出。在此模式下,所有非延迟初始化单例都已实例化,并且已调用 InitializingBean#afterPropertiesSet
回调;但生命周期尚未开始,并且尚未发布 ContextRefreshedEvent
。
要创建存档,必须指定两个附加 JVM 标志:
-
-XX:ArchiveClassesAtExit=application.jsa
:在退出时创建 CDS 归档 -
-Dspring.context.exit=onRefresh
:启动,然后立即退出 Springapplication,如上所述
要创建 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
Using the Archive
存档可用后,假设工作目录中有一个 application.jsa
文件,将 -XX:SharedArchiveFile=application.jsa
添加到启动脚本中以使用它。
若要检查 CDS 缓存是否有效,可以(仅用于测试目的,不得用于生产中)使用 -Xshare:on
,如果无法启用 CDS,它会打印一条错误消息并退出。
若要了解缓存的有效程度,可以通过添加额外属性 -Xlog:class+load:file=cds.log
启用类加载日志。这会为每次尝试加载类及其源创建 cds.log
。从缓存加载的类应具有“共享对象文件”源,如下面的示例所示:
[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 或目录可以在 at the end 中指定(但不会被缓存)。