问题 如何使用java 10的Application Class-Data Sharing功能?


我在Oracle doc中读到了关于CDS的内容 https://docs.oracle.com/javase/8/docs/technotes/guides/vm/class-data-sharing.html

我理解的是加载jvm所需的系统类文件被解析,验证,然后存储在jre / lib / [arch] /client/classes.jsa的存档中。此外,它们还为jvm提供了内存映射,因此jvm根据归档中给出的映射信息直接映射内存。因此,每次jvm实例启动时,这都会减少类加载的开销。如果错了请纠正我。

现在来到java 10,我如何为我的应用程序代码实现这一点? 其次,完整的应用程序代码是否有资格获得CDS或是否有一些限制?


7883
2018-05-31 21:00


起源

“为什么我们不将完整的应用程序代码编译为本机代码” - 你熟悉Graal吗? - Jacob G.
@Jacob所以现在我读到了graal,它是关于提前编译的。因此它减少了运行时编译开销。 - Shubham Kadlag
CDS不会将类编译为本机代码。它更预先加载(解析,验证等)某些类,并以二进制形式将它们存储在文件中,允许将映像直接映射到JVM的地址空间。 - apangin
@apangin感谢您的解释。我现在阅读更多关于CDS的内容,我认为我现在有更好的想法。我现在已经编辑了这个问题。非常感谢您的投入。 - Shubham Kadlag


答案:


创建和使用带有应用程序类数据的存档有三个基本步骤(有关详细信息,请阅读 我关于应用程序类 - 数据共享的帖子):

  1. 创建要包含在存档中的类列表:

    java -XX:+UseAppCDS
        -XX:DumpLoadedClassList=classes.lst -jar app.jar
    
  2. 创建存档:

    java -XX:+UseAppCDS -Xshare:dump 
        -XX:SharedClassListFile=classes.lst -XX:SharedArchiveFile=app-cds.jsa --class-path app.jar
    
  3. 使用存档:

    java -XX:+UseAppCDS -Xshare:on 
        -XX:SharedArchiveFile=app-cds.jsa -jar app.jar
    

请记住以下几点:

  • 创建存档时,不能使用通配符或爆炸JAR作为类路径
  • 用于启动应用程序的类路径必须具有用于创建存档作为前缀的类路径
  • 如果您有任何问题,请使用 -Xlog:class+load (更多关于 -Xlog)获取更多信息

7
2018-06-01 12:50





JEP 对于AppCDS,示例显示如何将应用程序类添加到共享存档。 至于限制,很少:

  1. 类路径上的目录中存在直接类(.class) 无法添加到共享存档中。看到这个 线
  2. 自定义加载的类 类加载器无法添加到共享存档中。看到这个 线

使用CDS / AppCDS时还需要注意其他一些注意事项,例如:

  1. 如果更新文件系统上的jar文件,则必须重新创建共享存档。
  2. 如果您正在使用在运行时修改/重新转换/重新定义类文件的Java或JVMTI代理,则共享存档将没有用,因为类将从磁盘加载,因为代理需要实际我认为类文件数据不存储在共享存档中。

另一篇关于CDS和AppCDS的精彩而详细的文章是 https://simonis.github.io/cl4cds/

该文章的作者也写了一篇 工具 允许共享应用程序类,即使它们被自定义类加载器加载。

如果您对使用CDS感兴趣,您也可以尝试OpenJ9 JVM,它具有此功能很长一段时间,并且更加成熟和完整。阅读更多相关信息 这里


3
2018-06-02 18:32