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=<值>:為了調整以獲得更好的峰值效能或更快的暖機。它會自動調整控制內聯期間所花費的精力值。選項的值是介於 -11 之間的浮點數,包含兩者。低於 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 }:由於方法中的某些屬性或程式碼形狀(例如,jsrret 位元組碼的特殊用法),編譯器可能無法完成方法的編譯。在這種情況下,編譯會「中止」。如果您想要知道此類中止,則此選項會讓 Graal JIT 編譯器將中止視為失敗,因此受 -Djdk.graal.CompilationFailureAction 選項指定的動作約束。(預設值:false。)

使用語言啟動器設定編譯器選項 #

上述 Graal JIT 編譯器屬性可用於其他一些 GraalVM 啟動器,例如 nodejs。指定屬性的前綴略有不同。例如

java -XX:+EagerJVMCI -Djdk.graal.ShowConfiguration=info -version

變成

js --vm.Djdk.graal.ShowConfiguration=info -version

請注意,-D 前綴已取代為 --vm.D

與我們聯繫