跳到主要内容

CDS

ChatGPT-4o-mini 中英对照 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.
shell

基础 CDS 存档通常是开箱即用提供的,但如果需要,也可以通过发出以下命令来创建:

$ java -Xshare:dump
shell

使用档案

一旦归档可用,请在启动脚本中添加 -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)
shell

如果无法启用 CDS,或者如果您有大量未从缓存加载的类,请确保在创建和使用归档时满足以下条件:

  • 必须使用相同的 JVM。

  • 类路径必须指定为 JAR 的列表,避免使用目录和 * 通配符。

  • JAR 的时间戳必须被保留。

  • 使用归档时,类路径必须与创建归档时使用的类路径相同,顺序也要一致。可以在 最后 指定额外的 JAR 或目录(但不会被缓存)。