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

Shu*_*lag 15 java jvm java-10

我在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或是否有一些限制?

Nic*_*lai 11

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

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

    java -XX:+UseAppCDS
        -XX:DumpLoadedClassList=classes.lst
        -jar app.jar
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建存档:

    java -XX:+UseAppCDS -Xshare:dump 
        -XX:SharedClassListFile=classes.lst
        -XX:SharedArchiveFile=app-cds.jsa
        --class-path app.jar
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用存档:

    java -XX:+UseAppCDS -Xshare:on 
        -XX:SharedArchiveFile=app-cds.jsa
        -jar app.jar
    
    Run Code Online (Sandbox Code Playgroud)

请记住以下几点:

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


Ash*_*osh 6

JEP的AppCDS有例子显示壳如何将应用程序类添加到共享归档。至于限制,几乎没有:

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

使用CDS / AppCDS时,还有其他一些实际注意事项,例如:

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

关于CDS和AppCDS的另一篇不错且详细的文章是https://simonis.github.io/cl4cds/

本文的作者还编写了一种工具,即使自定义类加载器加载了应用程序类,也可以共享它们。

如果您对使用CDS感兴趣,也可以尝试使用OpenJ9 JVM,它具有很长的一段时间,并且更加成熟和完整。在此处了解更多信息。