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 文件,否则可能导致加载失败或无法覆盖新增的类。

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