CDS
类数据共享 (CDS) 是一项 JVM 功能,可以帮助减少 Java 应用程序的启动时间和内存占用。
要使用此功能,应为应用程序的特定类路径创建一个 CDS 归档。TODAY Framework 提供了一个挂钩点,以简化归档的创建。一旦归档可用,用户应通过 JVM 标志选择使用它。
创建 CDS 归档
可以在应用程序退出时创建应用程序的 CDS 归档。Infra Framework 提供了一种操作模式,其中进程可以在 ApplicationContext 刷新后自动退出。在此模式下,所有非延迟初始化的单例都已实例化,并且已调用 InitializingBean#afterPropertiesSet 回调;但生命周期尚未开始,并且尚未发布 ContextRefreshedEvent。
要创建归档,必须指定两个额外的 JVM 标志:
-
-XX:ArchiveClassesAtExit=application.jsa:在退出时创建 CDS 归档 -
-Dinfra.context.exit=onRefresh:如上所述,启动然后立即退出您的 Infra 应用程序
要创建 CDS 归档,您的 JDK 必须具有基本映像。如果您将上述标志添加到启动脚本中,您可能会收到如下警告:
-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 文件。
要弄清楚缓存的有效性,您可以通过添加额外的属性来启用类加载日志:-Xlog:class+load:file=cds.log。这将创建一个 cds.log,其中包含加载类的每次尝试及其来源。从缓存加载的类应具有“共享对象文件”源,如以下示例所示:
[0.064s][info][class,load] infra.core.env.EnvironmentCapable source: shared objects file (top)
[0.064s][info][class,load] infra.beans.factory.BeanFactory source: shared objects file (top)
[0.064s][info][class,load] infra.beans.factory.ListableBeanFactory source: shared objects file (top)
[0.064s][info][class,load] infra.beans.factory.HierarchicalBeanFactory source: shared objects file (top)
[0.065s][info][class,load] infra.context.MessageSource source: shared objects file (top)
如果您有大量未从缓存加载的类,请确保创建归档和启动应用程序的命令使用的 JDK 和类路径完全相同。另请注意,为了有效地缓存类,应将类路径指定为包含这些类的 JAR 列表,并避免使用目录和 * 通配符。
|