CDS

类数据共享(CDS)是一个可以帮助减少Java应用程序启动时间和内存占用的JVM特性

要使用此功能,应为应用程序的特定类路径创建一个CDS存档。Spring框架提供了一个钩子点来简化存档的创建。一旦存档可用,用户应通过JVM标志选择使用它。

创建CDS存档

应用程序的CDS存档可以在应用程序退出时创建。Spring框架提供了一种操作模式,其中进程可以在ApplicationContext刷新后自动退出。在此模式下,所有非延迟初始化的单例已被实例化,并且已调用InitializingBean#afterPropertiesSet回调;但生命周期尚未启动,并且ContextRefreshedEvent尚未发布。

要创建存档,必须指定两个额外的JVM标志:

  • -XX:ArchiveClassesAtExit=application.jsa:在退出时创建CDS存档

  • -Dspring.context.exit=onRefresh:如上所述,启动然后立即退出Spring应用程序

要创建CDS存档,您的JDK必须具有基本映像。如果将上述标志添加到启动脚本中,可能会收到类似以下警告:

-XX:ArchiveClassesAtExit在未加载基本CDS存档时不受支持。运行-Xlog:cds以获取更多信息。

可以通过发出以下命令来创建基本CDS存档:

$ java -Xshare:dump

使用存档

一旦存档可用,将-XX:SharedArchiveFile=application.jsa添加到启动脚本中以使用它,假设工作目录中有一个application.jsa文件。

要了解缓存的有效性,可以通过添加额外属性-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)
如果有大量未从缓存加载的类,请确保创建存档和启动应用程序的命令使用的JDK和类路径相同。还要注意,为了有效地缓存类,应将类路径指定为包含这些类的JAR列表,并避免使用目录和*通配符字符。