Dynamic CDS无法使用归档文件问题求助
问题分析与解决方案
错误根源
你用错了JVM参数:-XX:DumpLoadedClassList的作用是生成已加载类的名称列表(文本文件),不是直接生成Dynamic CDS的二进制归档文件(.jsa)。你当前的cds.jsa本质是个文本文件,所以加载时会出现魔数不匹配的错误(0x4f4e2023对应文本开头的# NO 标识)。
正确操作步骤
1. 生成已加载类的列表文件
先运行应用,导出所有加载的类名到文本文件(建议用.txt后缀区分,避免混淆):
java -Xlog:cds -XX:DumpLoadedClassList=cds-classes.txt -jar app-0.0.1-SNAPSHOT.jar
执行完成后,你会得到cds-classes.txt,打开可以看到一堆类名,这说明步骤正确。
2. 基于类列表生成CDS归档文件
使用导出的类列表,生成真正的CDS二进制归档:
java -Xlog:cds -Xshare:dump -XX:SharedArchiveFile=cds.jsa -XX:ClassList=cds-classes.txt -jar app-0.0.1-SNAPSHOT.jar
这个命令会基于类列表和应用的类路径,生成符合要求的.jsa归档文件。
3. 使用CDS归档启动应用
现在可以用正确的归档文件启动应用了:
java -Xlog:cds -XX:SharedArchiveFile=cds.jsa -jar app-0.0.1-SNAPSHOT.jar
启动日志中会出现类似Loaded shared classes from archive的提示,说明CDS加载成功。
额外注意事项
- 生成归档和启动应用必须使用同一版本、同一环境的JDK,CDS归档和JDK版本强绑定,跨版本无法使用。
- 生成类列表时,确保应用正常启动完成(至少加载完核心类),否则类列表不完整会导致归档效果打折扣。
- Spring Boot 2.6.x对CDS的支持已经比较完善,默认场景下上述步骤即可生效,无需额外调整自定义类加载器参数。
内容的提问来源于stack exchange,提问作者SANN3
相关产品推荐
相关产品推荐

