gpt4 book ai didi

java - Java 9 是否支持提前编译?

转载 作者:搜寻专家 更新时间:2023-10-31 20:17:19 25 4
gpt4 key购买 nike

根据 JEP 295

AOT compilation of any JDK modules, classes, or of user code, is experimental and not supported in JDK 9.

To use the AOTed java.base module, the user will have to compile the module and copy the resulting AOT library into the JDK installation directory or specify it on java command line.

我对上面的说法感到困惑,如果 JDK 9 不支持 AOT 那么我们如何使用 AOT 编译模块?

我的第二个问题是为什么 JDK 9 不支持 AOT 如果它有很多 advantages over JIT?

最佳答案

这是一个实验性功能。

先从你的问题回答后半部分。 AOT 在与 Java 9 API 的兼容性方面并不完全成熟。链接的 JEP 中还列出了它的一些限制:

  • 它仍然仅限于基于 64 位 Linux 的系统。

  • 要使用AOT编译,用户需要使用同一个JDK进行编译和执行。有关用于编译的 jaotc 的版本信息被添加为库的一部分,并在加载时进行检查。如果更新了Java运行时,则需要在执行AOT编译模块之前重新编译它们。用于编译和执行的 JDK 版本不匹配可能会导致应用程序崩溃。

  • AOT 编译器目前不支持在运行时使用动态生成的类的 Lambda 表达式和其他复杂的 Java 概念。

  • 要生成共享对象 (.so) 文件,系统需要预先安装 libelf

  • java.base 的逻辑编译模式是分层 AOT,因为需要对 java.base 方法进行 JIT 重新编译以达到最佳性能。只有在某些情况下,非分层 AOT 编译才有意义。这包括需要可预测行为的应用程序,当占用空间比峰值性能更重要时,或者对于不允许动态代码生成的系统。在这些情况下,AOT 编译需要在整个应用程序上完成,因此在 JDK 9 中是实验性的。

这些限制可以在未来的版本中解决,届时我非常确定该功能的实验标签将被删除。


if AOT is not supported in JDK 9 then how can we compile the module using AOT?

要使用 AOT,需要使用 jaotc 编译器编译应用程序代码,考虑到上面列出的一些限制。如 Ahead-of-Time Compilation: AOT Usage 中所述如果 AOT 库已使用该工具编译为:

jaotc --output libHelloWorld.so HelloWorld.class

可以在执行阶段使用

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

前提是在编译时和运行时使用相同版本的 JVM 配置。

一旦使用上述命令触发执行,默认开启使用AOT编译文件。为了切换是否使用这些文件,引入了一个可以在执行阶段使用的新参数。即 -

-XX:+/-UseAOT    

更重要的是与您的上述两个问题相关,甚至在提案的风险和假设部分中明确提到:

If a user finds that an application starts up more slowly, or doesn't reach the expected peak performance, or crash, they can just switch AOT off with the -XX:-UseAOT flag, or remove any AOT libraries.

关于java - Java 9 是否支持提前编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46579565/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com