根据9月295
任何JDK模块、类或用户代码的AOT编译都是实验性的,在JDK 9中不支持。 要使用AOTed java.base模块,用户必须编译该模块并将得到的java.base库复制到JDK安装目录中,或者在java命令行上指定它。
我对上面的语句感到困惑,如果JDK 9中不支持AOT,那么如何使用AOT编译模块?
我的第二个问题是,如果有许多比JIT更有优势?,为什么JDK 9不支持AOT?
发布于 2017-10-05 07:15:13
这是一个实验性的特征。
首先从你的问题中回答后一部分。就与Java9API的兼容性而言,AOT并不完全成熟。它的一些限制也列在链接的JEP中:
jaotc的版本信息作为库的一部分添加,并在加载时进行检查。如果更新了Java运行时,则需要在执行之前重新编译AOT编译的模块。用于编译和执行的JDK版本不匹配可能导致应用程序崩溃。libelf .java.base的逻辑编译模式是分层的,因为java.base方法的JIT重新编译是为了达到最高性能。只有在某些情况下,非分层AOT编译才有意义。这包括需要可预测行为的应用程序,当占用空间比峰值性能更重要时,或者对于不允许动态代码生成的系统。在这些情况下,AOT编译需要在整个应用程序上完成,因此在JDK 9中是实验性的。这些限制可以在将来的版本中解决,也就是当我非常确信这个特性中的实验标签会被移除的时候。
如果JDK 9不支持AOT,那么如何使用AOT?编译模块?
为了利用AOT,需要使用jaotc编译器编译应用程序代码,考虑到上面列出的限制很少。如提前编译: AOT的使用中所述,如果已使用该工具编译了AOT库,则如下所示:
jaotc --output libHelloWorld.so HelloWorld.class它可以用于执行阶段。
java -XX:AOTLibrary=./libHelloWorld.so HelloWorld只要在编译时和运行时使用相同的版本JVM配置。
一旦使用上面的命令触发执行,默认情况下使用AOT编译的文件。为了切换是否使用这些文件,引入了一个可以在执行阶段使用的新参数。我.
-XX:+/-UseAOT 更重要的是,为了解决上述两个问题,甚至在建议的风险和假设部分中也清楚地提到了:
如果用户发现应用程序启动速度较慢,或者没有达到预期的峰值性能,或者崩溃,他们可以使用
-XX:-UseAOT标志关闭AOT,或者删除任何AOT库。
https://stackoverflow.com/questions/46579565
复制相似问题