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或目录(但不会被缓存)。