Moh*_*agi 5 java compilation java-9 java-aot
根据JEP 295
任何JDK模块,类或用户代码的AOT编译都是实验性的,在JDK 9中不受支持.
要使用AOTed java.base模块,用户必须编译模块并将生成的AOT库复制到JDK安装目录中,或在java命令行中指定它.
我对上面的语句感到困惑,如果JDK 9不支持AOT那么我们如何使用AOT编译模块?
先从你的问题来回答后半部分。AOT 在与 Java 9 API 的兼容性方面还不成熟。链接的 JEP 中还列出了一些限制:
它仍然仅限于基于 64 位 Linux 的系统。
要使用AOT编译,用户需要使用相同的JDK进行编译和执行。版本信息关于jaotc将作为库的一部分添加,并在加载时进行检查。如果Java运行时更新,则需要重新编译AOT编译的模块,然后才能执行它们。用于编译和执行的 JDK 版本不匹配可能会导致应用程序崩溃。
AOT 编译器当前不支持 Lambda 表达式和 Java 的其他复杂概念(在运行时使用动态生成的类)。
要生成共享对象(.so)文件,系统需要libelf要生成共享对象(.so)文件,需要预先安装
逻辑编译模式java.base是分层 AOT,因为java.base需要对方法进行 JIT 重新编译以达到峰值性能。仅在某些情况下,非分层 AOT 编译才有意义。这包括需要可预测行为的应用程序(当占用空间比峰值性能更重要时),或者对于不允许动态代码生成的系统。在这些情况下,AOT 编译需要在整个应用程序上完成,因此在 JDK 9 中是实验性的。
这些限制可以在未来的版本中得到解决,届时我非常确定该功能中的实验标签将被删除。
如果 JDK 9 不支持 AOT 那么我们如何使用 AOT 编译模块呢?
要使用 AOT,需要使用jaotc编译器来编译应用程序代码,并考虑上面列出的一些限制。如提前编译:AOT 用法中所述,如果已使用该工具编译 AOT 库,则:
jaotc --output libHelloWorld.so HelloWorld.class
Run Code Online (Sandbox Code Playgroud)
可以在执行阶段使用
java -XX:AOTLibrary=./libHelloWorld.so HelloWorld
Run Code Online (Sandbox Code Playgroud)
前提是在编译时和运行时使用相同版本的 JVM 配置。
一旦使用上述命令触发执行,AOT 编译文件的使用默认为ON。为了切换是否使用这些文件,引入了可在执行阶段使用的新参数。IE -
-XX:+/-UseAOT
Run Code Online (Sandbox Code Playgroud)
更重要的是,与您的上述两个问题相关,甚至正如提案的风险和假设部分中明确提到的那样:
如果用户发现应用程序启动速度更慢,或者没有达到预期的峰值性能,或者崩溃,他们可以使用该标志关闭 AOT
-XX:-UseAOT,或者删除任何 AOT 库。
| 归档时间: |
|
| 查看次数: |
3503 次 |
| 最近记录: |