CDS
类数据共享 (CDS) 是一个 JVM 特性,可以帮助减少 Java 应用程序的启动时间和内存占用。
要使用此特性,需要为应用程序的特定类路径创建 CDS 存档。Spring 框架提供了一个挂钩点,可以简化存档的创建。存档可用后,用户可以通过 JVM 标志选择使用它。
创建 CDS 存档
应用程序的 CDS 存档可以在应用程序退出时创建。Spring 框架提供了一种操作模式,该模式允许进程在 ApplicationContext
刷新后自动退出。在这种模式下,所有非延迟初始化的单例都已实例化,并且 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
,其中包含每次尝试加载类及其来源的信息。从缓存加载的类应该具有“共享对象文件”来源,如下例所示
[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 或目录(但不会被缓存)。