Graal JITコンパイラ構成
Graal JITコンパイラを構成するオプションには、一般、パフォーマンス・チューニングおよび診断という3つのカテゴリがあります。
Graal JITコンパイラは、コマンドラインで
-Djdk.graal...
を介して設定されたjdk.graal
接頭辞で始まる名前を持つシステム・プロパティによって主に構成されます。使用可能なプロパティのリストは、-XX:+JVMCIPrintProperties
オプションを使用して出力できます。
一般オプション
これらは、構成の詳細を設定/取得するための一般的なオプションです。
-XX:-UseJVMCICompiler
: 最上位層のJITコンパイラとしてのGraalコンパイラの使用を無効にします。これは、Graal JITコンパイラのパフォーマンスをネイティブJITコンパイラと比較する場合に役立ちます。-
-Djdk.graal.CompilerConfiguration=<name>
: 使用するGraal JITコンパイラ構成を選択します。省略すると、自動選択の優先度が最も高いコンパイラ構成が選択されます。使用可能な構成を表示するには、このオプションに値help
を指定します。コンパイラ構成の名前とそのセマンティクスは次のとおりです:
enterprise
: 高度に最適化されたコードを生成します。コンパイル時間が長くなる可能性があります(Oracle GraalVMでのみ使用可能)。community
: 適度に最適化されたコードを生成します。コンパイル時間が短縮されます。economy
: コンパイルを可能なかぎり高速化し、生成されるコードのスループットの最適化のレベルは低くなります。
-
-Djdk.graal.ShowConfiguration=<level>
: 選択したGraal JITコンパイラ構成に関する情報を出力します。このオプションを使用すると、コンパイラが初期化されるときにのみ出力が生成されます。デフォルトでは、Graal JITコンパイラは最上位層が初めてコンパイルされるときに初期化されます。このため、このオプションの使用方法はjava -XX:+EagerJVMCI -Djdk.graal.ShowConfiguration=info -version
のようになります。指定可能な引数は次のとおりです:
none
: 情報を表示しません。info
: 使用しているコンパイラ構成とそのロード元の場所を記述する単一行を出力します。verbose
: 詳細なコンパイラ構成情報を出力します。
-
-Djdk.graal.SpectrePHTBarriers=<strategy>
: 投機的境界チェック・バイパス(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=<value>
: ピーク・パフォーマンスの向上またはウォームアップの高速化のためのチューニングを行います。インライン化中に費やされる作業量を制御する値が自動的に調整されます。このオプションの値は、-1
から1
までの間の固定された浮動小数です。0
を下回るとインライン化の作業量が減少し、0
を上回るとインライン化の作業量が増加します。一般に、インライン化の作業量が増加するとピーク・パフォーマンスが向上し、インライン化の作業量が減少すると(ピークは低下しますが)ウォームアップが向上します。このオプションはヒューリスティックで、最適な値はアプリケーションごとに異なる可能性があることに注意してください(Oracle GraalVMでのみ使用可能)。
診断オプション
-
-Djdk.graal.CompilationFailureAction=<action>
: 例外をスローしてコンパイルが失敗した場合に実行するアクションを指定します。指定可能なアクション:
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コンパイラ・プロパティは、node
、js
などのその他のいくつかのGraalVMランチャで使用できます。プロパティを指定するための接頭辞は若干異なります。たとえば:
java -XX:+EagerJVMCI -Djdk.graal.ShowConfiguration=info -version
次のようになります:
js --vm.Djdk.graal.ShowConfiguration=info -version
-D
接頭辞は--vm.D
に置き換えられます。