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