You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java类数据共享(CDS)是否归档classpath类?实操问题求助

问题解答

一、LoadedClasses.lst和SharedArchive.jsa是否包含classpath中的类?

不一定。这取决于两个核心前提:

  1. 生成LoadedClasses.lst时,你的应用实际触发了这些类的加载(比如代码中实例化类、引用静态成员等)。JVM只会加载运行时用到的类,未被使用的类不会出现在该列表中。
  2. 执行-Xshare:dump时,JVM能正确识别classpath中的jar包,且目标类符合共享归档的要求(比如不是动态生成类、未被自定义类加载器加载等)。

从你的情况来看,运行时多数类仍从原路径加载,大概率是这些类没被纳入LoadedClasses.lst,或是归档生成过程中未被成功写入SharedArchive.jsa。

二、实现将classpath中的类纳入共享归档的步骤

1. 确保生成LoadedClasses.lst时加载目标类

修改测试代码,强制触发sample1.jar、sample2.jar中所有需要共享的类的加载:

// 在example.class的入口方法中添加:
Class.forName("com.sample1.ClassA");
Class.forName("com.sample1.ClassB");
Class.forName("com.sample2.ClassC");
// 按需列出所有需要共享的类

重新运行生成列表的命令(注意去掉classpath中分号后的空格,避免路径识别错误):

java -classpath "C:/dir/sample1.jar;C:/dir/sample2.jar" -XX:DumpLoadedClassList=LoadedClasses.lst example.class

打开LoadedClasses.lst文件,检查是否包含目标类的全限定名(如com.sample1.ClassA)。

2. 正确生成共享归档文件

执行-Xshare:dump时,保证classpath与生成列表时完全一致,且路径无多余空格,同时显式开启共享空间:

java -classpath "C:/dir/sample1.jar;C:/dir/sample2.jar" -XX:+UseSharedSpaces -Xshare:dump -XX:SharedClassListFile=LoadedClasses.lst -XX:SharedArchiveFile=SharedArchive.jsa example.class

3. 验证归档内容

用以下命令查看归档中的类列表,确认目标类已被包含:

# Windows系统
java -Xshare:print -XX:SharedArchiveFile=SharedArchive.jsa | findstr "com.sample1"
# Linux/macOS系统
java -Xshare:print -XX:SharedArchiveFile=SharedArchive.jsa | grep "com.sample1"

4. 运行时验证类加载来源

添加跟踪参数运行应用,查看类加载日志:

java -classpath "C:/dir/sample1.jar;C:/dir/sample2.jar" -Xshare:auto -XX:SharedArchiveFile=SharedArchive.jsa -XX:+TraceClassLoading example.class

日志中若出现[Loaded com.sample1.ClassA from shared objects file],说明类已从共享归档加载;若显示[Loaded com.sample1.ClassA from jar:file:/C:/dir/sample1.jar!/com/sample1/ClassA.class],则需回头检查前面的步骤。


内容的提问来源于stack exchange,提问作者Jeffrey Pham

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 22:47:47