As per JEP 295 http://openjdk.java.net/jeps/295
任何 JDK 模块、类或用户代码的 AOT 编译都是实验性的,JDK 9 中不支持。
要使用 AOT 化的 java.base 模块,用户必须编译该模块并将生成的 AOT 库复制到 JDK 安装目录中或在 java 命令行上指定。
我对上面的说法感到困惑,如果 JDK 9 不支持 AOT 那么我们如何使用 AOT 编译模块?
我的第二个问题是为什么 JDK 9 不支持 AOT,如果它有很多相对于 JIT 的优势? https://stackoverflow.com/questions/2106380/what-are-the-advantages-of-just-in-time-compilation-versus-ahead-of-time-compila
它是一个实验性功能。
先从你的问题来回答后半部分。 AOT 在与 Java 9 API 的兼容性方面还不成熟。链接的 JEP 中还列出了一些限制:
它仍然仅限于基于 64 位 Linux 的系统。
要使用AOT编译,用户需要使用相同的JDK进行编译和执行。版本信息关于jaotc
用于编译的内容作为库的一部分添加,并在加载时进行检查。如果Java运行时更新,则需要重新编译AOT编译的模块,然后才能执行它们。用于编译和执行的 JDK 版本不匹配可能会导致应用程序崩溃。
AOT 编译器当前不支持 Lambda 表达式和 Java 的其他复杂概念(在运行时使用动态生成的类)。
要生成共享对象(.so)文件,系统需要libelf
进行预安装。
逻辑编译模式为java.base
自 JIT 重新编译以来是分层 AOTjava.base
需要方法来达到最佳性能。仅在某些情况下,非分层 AOT 编译才有意义。这包括需要可预测行为的应用程序(当占用空间比峰值性能更重要时),或者对于不允许动态代码生成的系统。在这些情况下,AOT 编译需要在整个应用程序上完成,因此在 JDK 9 中是实验性的。
这些限制可以在未来的版本中得到解决,届时我非常确定该功能中的实验标签将被删除。
如果 JDK 9 不支持 AOT 那么我们如何使用 AOT 编译模块呢?
要使用 AOT,需要使用以下命令编译应用程序代码jaotc
编译器考虑了上面列出的一些限制。如中所述提前编译:AOT 用法 http://openjdk.java.net/jeps/295如果 AOT 库已使用该工具编译为:
jaotc --output libHelloWorld.so HelloWorld.class
可以在执行阶段使用
java -XX:AOTLibrary=./libHelloWorld.so HelloWorld
前提是在编译时和运行时使用相同版本的 JVM 配置。
一旦使用上述命令触发执行,就会使用AOT编译后的文件默认开启。为了切换是否使用这些文件,引入了可在执行阶段使用的新参数。 IE -
-XX:+/-UseAOT
更重要的是与您上面的两个问题相关,甚至如中明确提到的风险和假设提案部分:
如果用户发现应用程序启动速度更慢,或者没有达到预期的峰值性能,或者崩溃,他们可以直接切换
AOT 关闭-XX:-UseAOT
标记或删除任何 AOT 库。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)