Java类数据共享(CDS)是否归档classpath类?实操问题求助
问题解答
一、LoadedClasses.lst和SharedArchive.jsa是否包含classpath中的类?
不一定。这取决于两个核心前提:
- 生成
LoadedClasses.lst时,你的应用实际触发了这些类的加载(比如代码中实例化类、引用静态成员等)。JVM只会加载运行时用到的类,未被使用的类不会出现在该列表中。 - 执行
-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
相关产品推荐
相关产品推荐

