我在Oracle doc https://docs.oracle.com/javase/8/docs/technotes/guides/vm/class-data-sharing.html
中读到了关于CDS的内容我理解的是加载jvm所需的系统类文件被解析,验证,然后存储在jre / lib / [arch] /client/classes.jsa的存档中。此外,它们还为jvm提供了内存映射,因此jvm根据归档中给出的映射信息直接映射内存。因此,每次jvm实例启动时,这都会减少类加载的开销。如果错了,请纠正我。
现在来到java 10,如何为我的应用程序代码实现这一目标? 其次,完整的应用程序代码是否有资格获得CDS或是否有一些限制?
答案 0 :(得分:8)
使用应用程序类数据创建和使用存档有三个基本步骤(有关详细信息,请阅读my post about application class-data sharing):
创建要包含在存档中的类列表:
java -XX:+UseAppCDS
-XX:DumpLoadedClassList=classes.lst -jar app.jar
创建档案:
java -XX:+UseAppCDS -Xshare:dump
-XX:SharedClassListFile=classes.lst -XX:SharedArchiveFile=app-cds.jsa --class-path app.jar
使用存档:
java -XX:+UseAppCDS -Xshare:on
-XX:SharedArchiveFile=app-cds.jsa -jar app.jar
请记住以下几点:
-Xlog:class+load
(more on -Xlog
)获取更多信息答案 1 :(得分:4)
AppCDS的JEP示例显示如何将应用程序类添加到共享存档。 至于限制,很少有:
使用CDS / AppCDS时还需要注意其他一些注意事项,例如:
关于CDS和AppCDS的另一篇精彩而详细的文章是https://simonis.github.io/cl4cds/。
该文章的作者还编写了一个tool,允许共享应用程序类,即使它们被自定义类加载器加载。
如果您对使用CDS感兴趣,您也可以尝试OpenJ9 JVM,它具有此功能很长一段时间,并且更加成熟和完整。阅读更多相关信息here。