首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 9中有提前编译吗?

Java 9中有提前编译吗?
EN

Stack Overflow用户
提问于 2017-10-05 06:53:30
回答 1查看 4.2K关注 0票数 6

根据9月295

任何JDK模块、类或用户代码的AOT编译都是实验性的,在JDK 9中不支持。 要使用AOTed java.base模块,用户必须编译该模块并将得到的java.base库复制到JDK安装目录中,或者在java命令行上指定它。

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

我的第二个问题是,如果有许多比JIT更有优势?,为什么JDK 9不支持AOT?

EN

回答 1

Stack Overflow用户

发布于 2017-10-05 07:15:13

这是一个实验性的特征。

首先从你的问题中回答后一部分。就与Java9API的兼容性而言,AOT并不完全成熟。它的一些限制也列在链接的JEP中:

  • 它仍然限制在基于64位Linux的系统上。
  • 要使用AOT编译,用户需要使用相同的JDK进行编译和执行。用于编译的有关jaotc的版本信息作为库的一部分添加,并在加载时进行检查。如果更新了Java运行时,则需要在执行之前重新编译AOT编译的模块。用于编译和执行的JDK版本不匹配可能导致应用程序崩溃。
  • AOT编译器目前不支持Lambda表达式和Java的其他复杂概念,Java在运行时使用动态生成的类。
  • 要生成共享对象(.so)文件,系统需要预装libelf .
  • java.base的逻辑编译模式是分层的,因为java.base方法的JIT重新编译是为了达到最高性能。只有在某些情况下,非分层AOT编译才有意义。这包括需要可预测行为的应用程序,当占用空间比峰值性能更重要时,或者对于不允许动态代码生成的系统。在这些情况下,AOT编译需要在整个应用程序上完成,因此在JDK 9中是实验性的。

这些限制可以在将来的版本中解决,也就是当我非常确信这个特性中的实验标签会被移除的时候。

如果JDK 9不支持AOT,那么如何使用AOT?编译模块?

为了利用AOT,需要使用jaotc编译器编译应用程序代码,考虑到上面列出的限制很少。如提前编译: AOT的使用中所述,如果已使用该工具编译了AOT库,则如下所示:

代码语言:javascript
复制
jaotc --output libHelloWorld.so HelloWorld.class

它可以用于执行阶段。

代码语言:javascript
复制
java -XX:AOTLibrary=./libHelloWorld.so HelloWorld

只要在编译时和运行时使用相同的版本JVM配置。

一旦使用上面的命令触发执行,默认情况下使用AOT编译的文件。为了切换是否使用这些文件,引入了一个可以在执行阶段使用的新参数。我.

代码语言:javascript
复制
-XX:+/-UseAOT    

更重要的是,为了解决上述两个问题,甚至在建议的风险和假设部分中也清楚地提到了

如果用户发现应用程序启动速度较慢,或者没有达到预期的峰值性能,或者崩溃,他们可以使用-XX:-UseAOT标志关闭AOT,或者删除任何AOT库。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46579565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档