簡體   English   中英

Java 9中是否提供提前編譯?

[英]Is Ahead-Of-Time compilation available in Java 9?

根據JEP 295

JDK 9不支持任何JDK模塊,類或用戶代碼的AOT編譯。

要使用AOTed java.base模塊,用戶將必須編譯該模塊並將生成的AOT庫復制到JDK安裝目錄中,或在java命令行上指定它。

我對以上聲明感到困惑,如果JDK 9不支持AOT,那么我們如何使用AOT編譯模塊?

我的第二個問題是,為什么JOT 9 比JIT有很多優勢,為什么JOT 9不支持AOT

它是實驗性功能。

首先從您的問題中回答后一部分。 就與Java 9 API的兼容性而言,AOT尚未完全成熟。 鏈接的JEP中也列出了一些限制:

  • 它仍然僅限於基於64位Linux的系統。

  • 要使用AOT編譯,用戶需要使用相同的JDK進行編譯和執行。 有關用於編譯的jaotc版本信息將作為庫的一部分添加,並在加載期間進行檢查。 如果Java運行時已更新,則需要在執行AOT編譯模塊之前重新編譯它們。 用於編譯和執行的JDK版本不匹配可能會導致應用程序崩潰。

  • AOT編譯器目前不支持Lambda表達式和其他復雜的Java概念,這些概念在運行時使用動態生成的類。

  • 要生成共享對象(.so)文件,系統需要預安裝libelf

  • java.base的邏輯編譯模式是AOT分層,因為需要對java.base方法進行JIT重新編譯才能達到最佳性能。 僅在某些情況下,無級AOT編譯才有意義。 當占用空間比峰值性能更重要時,或者在不允許動態代碼生成的系統中,這包括需要可預測行為的應用程序。 在這些情況下,需要在整個應用程序上進行AOT編譯,因此在JDK 9中是試驗性的。

這些限制可以在將來的版本中解決,也就是我非常確定該功能中的“實驗”標記將被刪除時。


如果JDK 9不支持AOT,那么我們如何使用AOT編譯模塊?

要使用AOT,需要使用jaotc編譯器來編譯應用程序代碼,而jaotc考慮上面列出的限制。 如《 提前編譯:AOT使用情況》中所述,如果使用該工具將AOT庫編譯為:

jaotc --output libHelloWorld.so HelloWorld.class

可以在執行階段使用

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

如果在編譯時和運行時都使用相同版本的JVM配置。

使用上述命令觸發執行后, 默認情況下會使用AOT編譯文件。 為了切換是否使用這些文件,引入了一個新的參數,該參數可以在執行階段使用。 即-

-XX:+/-UseAOT    

更重要的是要與您的上述兩個問題以及建議的“ 風險與假設”部分中明確提到的問題相關:

如果用戶發現應用程序啟動速度較慢,或者未達到預期的峰值性能或崩潰,則可以使用-XX:-UseAOT標志關閉AOT,或刪除任何AOT庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM