1

For those who know jaotc, I have a simple question for you.

After you do

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

You can run

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

without any problem. This is what has been shown on the internet everywhere. Fine with me.

However, if you move your HelloWorld.class somewhere else that is not in your classpath, and run

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

again, then you will get a class not found error.

So the original .class file is still needed? Then what's the point of doing the AOT?

4

2 回答 2

0

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

由于类字节码会随着时间的推移而改变,无论是通过更改源代码还是通过类转换和重新定义,JVM 需要检测此类更改并在字节码不匹配时拒绝 AOT 编译的代码。这是通过类指纹实现的。在 AOT 编译期间,每个类的指纹都会生成并存储在共享库的数据部分中。稍后,当加载一个类并找到该类的 AOT 编译代码时,会将当前字节码的指纹与存储在共享库中的指纹进行比较。如果不匹配,则不使用该特定类的 AOT 代码。

于 2018-07-25T02:33:14.760 回答
0

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

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

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

于 2019-08-25T08:57:59.867 回答