- 適用於 JDK 23 的 GraalVM (最新)
- 適用於 JDK 24 的 GraalVM (搶先體驗)
- 適用於 JDK 21 的 GraalVM
- 適用於 JDK 17 的 GraalVM
- 封存
- 開發版本
Graal JIT 編譯器配置
配置 Graal JIT 編譯器的選項分為三個類別:一般、效能調整和診斷。
Graal JIT 編譯器主要透過系統屬性進行配置,這些屬性的名稱以
jdk.graal
前綴開頭,並透過命令列上的-Djdk.graal...
進行設定。可以使用-XX:+JVMCIPrintProperties
選項列印可用的屬性清單。
一般選項 #
這些是一般選項,用於設定/取得配置詳細資訊。
-XX:-UseJVMCICompiler
:停用 Graal 編譯器作為頂層 JIT 編譯器的使用。當您想要比較 Graal JIT 編譯器與原生 JIT 編譯器的效能時,這很有用。-
-Djdk.graal.CompilerConfiguration=<名稱>
:選取要使用的 Graal JIT 編譯器配置。如果省略,則會選取具有最高自動選取優先順序的編譯器配置。若要查看可用的配置,請將值help
提供給此選項。編譯器配置的名稱及其語義為
enterprise
:產生高度最佳化的程式碼,但可能會以編譯時間作為權衡(僅在 Oracle GraalVM 中可用)。community
:產生合理最佳化的程式碼,並具有更快的編譯時間。economy
:盡可能快速編譯,但產生程式碼的吞吐量較不佳。
-
-Djdk.graal.ShowConfiguration=<層級>
:列印有關所選 Graal JIT 編譯器配置的資訊。此選項僅在編譯器初始化時才會產生輸出。根據預設,Graal JIT 編譯器會在第一個頂層編譯時初始化。因此,使用此選項的方式如下:java -XX:+EagerJVMCI -Djdk.graal.ShowConfiguration=info -version
。接受的引數為
none
:不顯示任何資訊。info
:列印一行輸出,描述正在使用的編譯器配置及其載入位置。verbose
:列印詳細的編譯器配置資訊。
-
-Djdk.graal.SpectrePHTBarriers=<策略>
:選取一種策略來減輕推測性邊界檢查繞過(也稱為 Spectre-PHT 或 Spectre V1)。接受的引數為
None
:在 JIT 編譯的程式碼中不使用任何緩解措施。(預設值。)AllTargets
:使用推測性執行屏障指令來停止所有分支目標上的推測性執行。此選項等效於將SpeculativeExecutionBarriers
設定為true
。(這會對效能產生很大的影響。)GuardTargets
:使用屏障指令檢測與 Java 記憶體安全相關的分支目標。僅保護那些保留 Java 記憶體安全的分支。(此選項對效能的影響低於AllTargets
。)NonDeoptGuardTargets
:與GuardTargets
相同,只是不會保護被取消最佳化的分支,因為它們無法重複執行,因此不太可能在攻擊中被成功利用。
請注意,除了
None
之外的所有模式還會使用屏障指令檢測包含UNSAFE
記憶體存取的分支目標區塊。
效能調整選項 #
-Djdk.graal.Vectorization={ true | false }
:停用自動向量化最佳化(僅在 Oracle GraalVM 中可用)。(預設值:true
。)-Djdk.graal.OptDuplication={ true | false }
:停用路徑複製最佳化(僅在 Oracle GraalVM 中可用)。(預設值:true
。)-Djdk.graal.TuneInlinerExploration=<值>
:為了調整以獲得更好的峰值效能或更快的暖機。它會自動調整控制內聯期間所花費的精力值。選項的值是介於-1
和1
之間的浮點數,包含兩者。低於0
的值會減少內聯精力,而高於0
的值會增加內聯精力。一般而言,峰值效能會透過更多的內聯精力來改善,而較少的內聯精力則會改善暖機(儘管達到較低的峰值)。請注意,此選項僅是一種啟發式方法,最佳值可能因應用程式而異(僅在 Oracle GraalVM 中可用)。
診斷選項 #
-
-Djdk.graal.CompilationFailureAction=<動作>
:指定當編譯因擲回例外而失敗時要採取的動作。接受的動作
Silent
:不向主控台列印任何內容。(預設值。)Print
:向主控台列印堆疊追蹤。Diagnose
:重試編譯,並啟用額外的診斷功能。在 JVM 結束時,收集到的診斷會儲存到 ZIP 檔案中,該檔案可以隨錯誤報告一起提交。系統會向主控台列印一則訊息,描述診斷檔案的儲存位置Graal diagnostic output saved in /Users/graal/graal_dumps/1549459528316/graal_diagnostics_22774.zip
ExitVM
:與Diagnose
相同,只是 JVM 程序會在重試後結束。
對於除了
ExitVM
之外的所有值,JVM 會繼續運作。 -
-Djdk.graal.CompilationBailoutAsFailure={ true | false }
:由於方法中的某些屬性或程式碼形狀(例如,jsr
和ret
位元組碼的特殊用法),編譯器可能無法完成方法的編譯。在這種情況下,編譯會「中止」。如果您想要知道此類中止,則此選項會讓 Graal JIT 編譯器將中止視為失敗,因此受-Djdk.graal.CompilationFailureAction
選項指定的動作約束。(預設值:false
。)
使用語言啟動器設定編譯器選項 #
上述 Graal JIT 編譯器屬性可用於其他一些 GraalVM 啟動器,例如 node
和 js
。指定屬性的前綴略有不同。例如
java -XX:+EagerJVMCI -Djdk.graal.ShowConfiguration=info -version
變成
js --vm.Djdk.graal.ShowConfiguration=info -version
請注意,
-D
前綴已取代為--vm.D
。