- JDK 23用GraalVM (最新)
- JDK 24用GraalVM (早期アクセス)
- JDK 21用GraalVM
- JDK 17用GraalVM
- アーカイブ
- 開発ビルド
Graal JITコンパイラの設定
Graal JITコンパイラを設定するためのオプションは、一般、パフォーマンスチューニング、診断の3つのカテゴリに分類されます。
Graal JITコンパイラは、主に`jdk.graal`プレフィックスで始まるシステムプロパティによって設定され、コマンドラインで`-Djdk.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`:使用中のコンパイラ設定とそのロード元を説明する1行の出力を表示します。
- `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`に置き換えられていることに注意してください。