类数据共享 (CDS) 是一项 JVM 功能,可帮助减少 Java 应用程序的启动时间和内存占用。

要使用此功能,应为 应用。Spring 框架提供了一个钩子点,以简化创建 档案。一旦归档文件可用,用户就应该通过 JVM 标志选择使用它。

创建 CDS 存档

当应用程序退出时,可以为应用程序创建 CDS 存档。春天 框架提供了一种操作模式,在该模式下,进程可以在刷新后自动退出。在此模式下,所有非延迟初始化的单例 已被实例化,回调已被实例化 调用;但是生命周期还没有开始,而且还没有 已出版。ApplicationContextInitializingBean#afterPropertiesSetContextRefreshedEvent

要创建归档文件,必须指定两个额外的 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.jsaapplication.jsa

要检查 CDS 缓存是否有效,您可以使用(仅用于测试目的,不在生产环境中)使用 打印错误消息,如果无法启用 CDS,则退出。-Xshare:on

要确定缓存的有效性,您可以通过添加 一个额外的属性:.这创造了一个与每个 尝试加载类及其源代码。从缓存加载的类应具有 “共享对象文件”源,如以下示例所示:-Xlog:class+load:file=cds.logcds.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 或目录(但不会缓存)。