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

2022-09-02 01:34:23

我在Oracle文档中阅读了有关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的条件,还是有一些限制?


答案 1

创建和使用包含应用程序类数据的归档文件有三个基本步骤(有关更多详细信息,请阅读我关于应用程序类数据共享的文章):

  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的更多信息)以获取更多信息-Xlog:class+load

答案 2

适用于 AppCDS 的 JEP 示例展示了如何将应用程序类添加到共享存档的大小写。至于限制,几乎没有:

  1. 无法将类路径上目录中存在的直类(.class)添加到共享存档中。请参阅此主题
  2. 由定制类装入器装入的类不能添加到共享归档中。请参阅此主题

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

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

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

本文的作者还编写了一个工具,即使应用程序类由自定义类装入器加载,也允许共享应用程序类。

如果你有兴趣使用CDS,你也可以试试OpenJ9 JVM,它有很长一段时间的这个功能,而且更加成熟和完整。在此处阅读更多相关信息。


推荐