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 中指定(但不会被缓存)。