文章目录

Java Class-Data Sharing加速JVM启动的预热优化

发布于 2026-05-01 13:23:04 · 浏览 12 次 · 评论 0 条

Java Class-Data Sharing(CDS,类数据共享)通过将一组类预处理为共享归档文件,让多个 JVM 进程可以共享这部分内存数据。这避免了每次启动时重复加载类、验证类和解析符号的开销,从而显著缩短应用启动时间并降低内存占用。以下分为“动态 CDS(推荐,JDK 13+)”和“静态 CDS(传统方式,JDK 8+)”两套操作流程。


一、 动态 CDS (JDK 13 及以上版本)

动态 CDS 会在 JVM 退出时自动归档应用程序加载的类,无需手动生成类列表,操作最为简便。

1. 生成共享归档文件

执行应用程序,并添加 -XX:ArchiveClassesAtExit 参数,指定归档文件的输出路径。假设你的应用 Jar 包为 app.jar

java -XX:ArchiveClassesAtExit=app-cds.jsa -jar app.jar

等待程序执行完毕或手动停止。程序退出后,当前目录下会生成 app-cds.jsa 文件。

2. 使用归档文件启动应用

运行应用程序时,添加 -XX:SharedArchiveFile 参数,指向刚才生成的文件。

java -XX:SharedArchiveFile=app-cds.jsa -jar app.jar

二、 静态 CDS (JDK 8u40 及以上版本)

如果使用的 JDK 版本低于 13,或者需要更精细地控制归档内容,请使用此方法。此过程分三步:生成类列表、转储归档、使用归档。

1. 生成类列表

运行应用程序,添加 -XX:DumpLoadedClassList 参数,将加载过的所有类名输出到指定文件中。

java -XX:DumpLoadedClassList=classes.lst -jar app.jar

确认当前目录下已生成 classes.lst 文件。

2. 创建共享归档文件

执行以下命令,利用上一步生成的列表创建归档文件。注意需要指定 -Xshare:dump

java -Xshare:dump -XX:SharedClassListFile=classes.lst -XX:SharedArchiveFile=app-cds.jsa -cp app.jar

检查控制台输出是否包含 Shared space is 0x0000000800000000 等类似地址信息,确表示归档创建成功。

3. 使用归档文件启动应用

启动应用时,指定使用归档文件。

java -Xshare:on -XX:SharedArchiveFile=app-cds.jsa -jar app.jar

三、 验证优化效果

为了确认 CDS 是否生效,检查 JVM 启动日志(默认输出到控制台)。

查找以下关键日志信息:

  • 成功加载:sharing is enabled
  • 归档地址:Shared space is 0x...

如果看到 sharing is enabled,说明 JVM 已经从共享归档中加载类数据,优化已生效。


四、 对比与注意事项

特性 动态 CDS (JDK 13+) 静态 CDS (JDK 8+)
操作步骤 仅需两步 (运行生成、运行使用) 需三步 (列表、归档、使用)
类列表 自动捕获运行时加载的类 需手动指定类列表文件
灵活性 高 (自动包含应用实际使用的类) 中 (需确保列表文件覆盖全面)
适用场景 现代应用、微服务、容器化环境 遗留系统、旧版 JDK 维护

注意:如果应用升级依赖或代码结构发生重大变化,重新生成 .jsa 文件,否则可能导致加载失败或无法覆盖新增的类。

评论 (0)

暂无评论,快来抢沙发吧!

扫一扫,手机查看

扫描上方二维码,在手机上查看本文