有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

jvm如何使用Java10的应用程序类数据共享功能?

我在Oracle文档https://docs.oracle.com/javase/8/docs/technotes/guides/vm/class-data-sharing.html中读到有关CD的内容

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

现在来看Java10,我如何为我的应用程序代码实现这一点? 第二,完整的申请代码是否符合CD的资格,或者是否有一些限制


共 (2) 个答案

  1. # 1 楼答案

    创建和使用带有应用程序类数据的存档有三个基本步骤(有关更多详细信息,请阅读my post about application class-data sharing):

    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+loadmore on ^{})获取更多信息
  2. # 2 楼答案

    appcd的JEP示例展示了如何将应用程序类添加到共享存档中。 至于限制,有几个:

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

    在使用CD/AppCD时,还需要注意其他一些实际注意事项,例如:

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

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

    本文作者还编写了一个tool,允许共享应用程序类,即使它们是由自定义类装入器装入的

    如果你对使用CD感兴趣,你也可以尝试OpenJ9 JVM,它有这个功能已经很长时间了,而且更加成熟和完整。阅读更多关于它的信息