【问题标题】:Original class file still needed after jaotc compilation?jaotc编译后还需要原始类文件吗?
【发布时间】:2018-11-23 09:38:11
【问题描述】:

对于那些了解 jaotc 的人,我有一个简单的问题要问你。

做完之后

javac HelloWorld.java
jaotc --output HelloWorld.so HelloWorld.class

你可以跑

java -XX:AOTLibrary=./HelloWorld.so HelloWorld

没有任何问题。这是在互联网上随处可见的。我没问题。

但是,如果您将 HelloWorld.class 移动到不在类路径中的其他位置,然后运行

java -XX:AOTLibrary=./HelloWorld.so HelloWorld

同样,你会得到一个找不到类的错误。

那么原来的.class文件还需要吗?那么做AOT有什么意义呢?

【问题讨论】:

  • 重点是JVM启动更快。

标签: java jaotc


【解决方案1】:

是的,至少到目前为止。你可以参考http://openjdk.java.net/jeps/295

由于类字节码会随着时间而改变,要么通过改变 源代码或通过类转换和重新定义,JVM 需要检测此类更改并拒绝 AOT 编译的代码,如果 字节码不匹配。这是通过类指纹实现的。 在 AOT 编译期间,会为每个类生成一个指纹,并 存储在共享库的数据部分。后来上课的时候 已加载并找到此类的 AOT 编译代码, 当前字节码的指纹与存储在 共享库。如果不匹配,则该 AOT 代码 不使用特定的类。

【讨论】:

    【解决方案2】:

    当我发现在我的本机版本的 Minecraft 中加载的唯一 Java 本机映像是 java.base 时,我怀疑这一点。我不知道为什么,直到我读到这篇文章。

    如果可能,AOT 图像只是可供使用的替代图像。它们不是原始 Java 字节码的替代品。

    这是为了防止 JVM 参数不同和/或在不同平台上运行。如果您尝试制作 Java 本机应用程序,我相信 IKVM.NET 更适合您的目的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-14
      • 2014-01-05
      • 2015-12-27
      相关资源
      最近更新 更多