- 適用於 JDK 23 的 GraalVM (最新)
- 適用於 JDK 24 的 GraalVM (搶先體驗)
- 適用於 JDK 21 的 GraalVM
- 適用於 JDK 17 的 GraalVM
- 封存
- 開發組建
Graal 編譯器
Graal 編譯器是一個以 Java 撰寫的動態編譯器,可將位元組碼轉換為機器碼。Graal 即時 (JIT) 編譯器與 Java HotSpot 虛擬機器和 GraalVM 整合。如需更多資訊,請參閱 Java 虛擬機器指南和 GraalVM 作為虛擬機器章節。(Graal JIT 編譯器的開放原始碼位於 GitHub。)
編譯器優勢 #
Graal JIT 編譯器透過獨特的程式碼分析和最佳化方法,為在 Java 虛擬機器 (JVM) 上執行的應用程式提供最佳化的效能。它包含多種最佳化演算法(稱為「階段」),例如積極內嵌、多型內嵌等。
Graal 編譯器可以為高度抽象化的程式帶來效能優勢。例如,它包含部分逸出分析最佳化,可以移除某些物件的昂貴配置。如需更多資訊,請參閱 GraalVM GitHub 儲存庫中 CEOptimization enum
的值 PartialEscapeAnalysis
。最佳化會判斷新的物件何時可在編譯單元之外存取,並僅在「逸出」編譯單元的路徑上配置它 (例如,如果物件作為參數傳遞、儲存在欄位中或從方法傳回)。這種方法可以透過減少堆積配置的數量來大幅提高應用程式的效能。使用更多現代 Java 功能 (例如 Streams 或 Lambdas) 的程式碼,將會看到更大的效能提升,因為這類程式碼涉及大量的非逸出或部分逸出物件。受到 I/O 或無法由編譯器移除的記憶體配置等特性限制的程式碼,改善幅度會較小。如需更多效能調整的資訊,請參閱 Graal JIT 編譯器設定。
圖表編譯 #
為了在與主機 JVM 為基礎的語言相同的執行階段中執行客座程式設計語言(即 JavaScript、Python 和 Ruby),編譯器會使用來源語言和要產生的機器碼之間的與語言無關的中間圖表表示法。(如需語言互通性的更多資訊,請參閱 互通性。)
圖表可以用相同的方式表示不同語言的類似陳述式,例如「if」陳述式或迴圈,這使得可以在同一個應用程式中混合使用不同的語言。然後,Graal 編譯器可以在這個圖表上執行與語言無關的最佳化,並產生機器碼。
診斷資料 #
如果編譯器擲回未捕獲的例外狀況,通常會捨棄編譯,並繼續執行。Graal 編譯器可以產生診斷資料(例如立即表示圖表),這些資料可以與錯誤報告一起提交。這可以使用 -Djdk.graal.CompilationFailureAction=Diagnose
選項啟用。診斷輸出的預設位置是處理序目前工作目錄下的 graal_dumps/ 目錄,但可以使用 -Djdk.graal.DumpPath
選項變更。在 JVM 關閉期間,包含診斷資料的封存位置會列印到主控台。
此外,可以使用 -Djdk.graal.Dump
選項為 Graal 編譯器執行的任何編譯產生診斷資料。這將為編譯器編譯的每個方法產生診斷資料。
若要精簡產生診斷資料的方法集,請使用 -Djdk.graal.MethodFilter=<類別>.<方法>
選項。例如,-Djdk.graal.MethodFilter=java.lang.String.*,HashMap.get
將僅為 java.lang.String
類別中的方法,以及類別非限定名稱為 HashMap
的類別中名為 get
的方法產生診斷資料。