[英]Is Ahead-Of-Time compilation available in Java 9?
首先從您的問題中回答后一部分。 就與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.