【问题标题】:How to use Application Class-Data Sharing feature of java 10?如何使用 java 10 的应用程序类数据共享功能?
【发布时间】:2019-06-25 21:55:30
【问题描述】:

我在 Oracle 文档 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 或有一些限制?

【问题讨论】:

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

标签: java jvm java-10


【解决方案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+load (more on -Xlog) 获取更多信息

【讨论】:

  • 第一步我只得到了 spring 和 java 类。 jar 库中缺少类。尝试手动将它们添加到列表中,得到错误Preload Warning: Cannot find com/example/SomeServiceClass。如何正确地将自定义类添加到 classes.lst?
  • 在 java 1.8 上 --class-path 的替代品是什么?
  • @Woland 在 Java 8 上,这是一个商业功能,对吧?我不知道它是否以同样的方式工作。但在 Java 8 上,它是 -classpath 或只是 -cp
【解决方案2】:

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

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

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

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

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

文章的作者还写了一个tool,它允许共享应用程序类,即使它们是由自定义类加载器加载的。

如果你对使用CDS感兴趣,你也可以试试OpenJ9 JVM,这个特性由来已久,而且更加成熟和完善。阅读更多关于它的信息here

【讨论】:

    猜你喜欢
    • 2011-09-27
    • 2012-02-29
    • 2023-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    相关资源
    最近更新 更多