JVMでのコンパイラ構成
JVMでGraalコンパイラを構成するためのオプションは、3つのカテゴリに分かれます。
一般オプション
これらは、構成の詳細を設定/取得するための一般的なオプションです。
-XX:-UseJVMCICompiler
: 最上位層のJITとしてのGraalコンパイラの使用を無効にします。これは、GraalコンパイラのパフォーマンスをネイティブJITコンパイラと比較する場合に役立ちます。-
-Dgraal.CompilerConfiguration=<name>
: 使用するGraalコンパイラ構成を選択します。省略すると、自動選択の優先度が最も高いコンパイラ構成が使用されます。使用可能な一連の構成を表示するには、このオプションに値ヘルプを指定します。現在の構成とそのセマンティクスは次のとおりです:
enterprise
: 高度に最適化されたコードを生成します。コンパイル時間が長くなる可能性があります。[Oracle GraalVM]community
: 適度に最適化されたコードを生成します。コンパイル時間が短縮されます。economy
: コンパイルを可能なかぎり高速化し、生成されるコードのスループットの最適化のレベルは低くなります。
-
-Dgraal.ShowConfiguration=none
: 選択したGraalコンパイラ構成に関する情報を出力します。このオプションを使用すると、コンパイラが初期化されるときにのみ出力が生成されます。デフォルトでは、Graalコンパイラは最上位層が初めてコンパイルされるときに初期化されます。このため、このオプションの使用方法はjava -XX:+EagerJVMCI -Dgraal.ShowConfiguration=info -version
のようになります。このオプションの有効な値は、次のとおりです:
none
: 情報を表示しません。info
: 使用中のコンパイラ構成と、ネイティブ・イメージからロードされたか(libgraal)、クラス・ファイルからロードされたか(jargraal)を記述した1行を出力します。verbose
: 詳細なコンパイラ構成情報を出力します。
-
-Dgraal.MitigateSpeculativeExecutionAttacks=None
: 投機的実行攻撃(SPECTREなど)を軽減する方針を選択します。有効な値は、次のとおりです:
None
: JITコンパイル済コードで軽減は行われません。AllTargets
: すべてのブランチが投機的攻撃から保護されます。これは、パフォーマンスに大きく影響します。GuardTargets
: Javaメモリー安全性を保持するブランチのみが保護されます。パフォーマンスへの影響は少なくなります。NonDeoptGuardTargets
: GuardTargetsと同じですが、最適化が解除されたブランチは繰り返し実行できないため保護されません。
パフォーマンス・チューニング・オプション
-Dgraal.UsePriorityInlining=true
: コンパイル速度よりもスループットを優先する高度なインライン化アルゴリズムの使用を無効にするために使用できます。[Oracle GraalVM]-Dgraal.Vectorization=true
: 自動ベクトル化の最適化を無効にするために使用できます。[Oracle GraalVM]-Dgraal.OptDuplication=true
: パス複製の最適化を無効にするために使用できます。[Oracle GraalVM]-Dgraal.TuneInlinerExploration=0
: ピーク・パフォーマンスの向上またはウォームアップの高速化のためのチューニングを試行するために使用できます。インライン化中に費やされる作業量を制御する値が自動的に調整されます。このオプションの値は、-1
から1
までの間の固定された浮動小数です。0
を下回るとインライン化の作業量が減少し、0
を上回るとインライン化の作業量が増加します。一般に、インライン化の作業量が増加するとピーク・パフォーマンスが向上し、インライン化の作業量が減少すると(ピークは低下しますが)ウォームアップが向上します。このオプションはヒューリスティックで、最適な値はアプリケーションごとに異なる可能性があることに注意してください。[Oracle GraalVM]-
-Dgraal.TraceInlining=false
: インライン化の決定のトレースを有効にします。これは、プログラムのソース・コードを変更できる可能性がある高度なチューニングに使用できます。出力形式は次のとおりです:compilation of 'Signature of the compilation root method': at 'Sig of the root method' ['Bytecode index']: <'Phase'> 'Child method signature': 'Decision made about this callsite' at 'Signature of the child method' ['Bytecode index']: |--<'Phase 1'> 'Grandchild method signature': 'First decision made about this callsite' \--<'Phase 2'> 'Grandchild method signature': 'Second decision made about this callsite' at 'Signature of the child method' ['Bytecode index']: <'Phase'> 'Another grandchild method signature': 'The only decision made about this callsite.'
たとえば:
compilation of java.lang.Character.toUpperCaseEx(int): at java.lang.Character.toUpperCaseEx(Character.java:7138) [bci: 22]: ├──<GraphBuilderPhase> java.lang.CharacterData.of(int): no, bytecode parser did not replace invoke └──<PriorityInliningPhase> java.lang.CharacterData.of(int): yes, worth inlining according to the cost-benefit analysis. at java.lang.Character.toUpperCaseEx(Character.java:7138) [bci: 26]: ├──<GraphBuilderPhase> java.lang.CharacterDataLatin1.toUpperCaseEx(int): no, bytecode parser did not replace invoke └──<PriorityInliningPhase> java.lang.CharacterDataLatin1.toUpperCaseEx(int): yes, worth inlining according to the cost-benefit analysis. at java.lang.CharacterDataLatin1.toUpperCaseEx(CharacterDataLatin1.java:223) [bci: 4]: ├──<GraphBuilderPhase> java.lang.CharacterDataLatin1.getProperties(int): no, bytecode parser did not replace invoke └──<PriorityInliningPhase> java.lang.CharacterDataLatin1.getProperties(int): yes, worth inlining according to the cost-benefit analysis.
診断オプション
-
-Dgraal.CompilationFailureAction=Silent
: 例外をスローしてコンパイルが失敗した場合に実行するアクションを指定します。有効な値は次のとおりです。
Silent
: コンソールに何も出力しません。Print
: スタック・トレースをコンソールに出力します。Diagnose
: 追加の診断を有効にしてコンパイルを再試行します。VMの終了時に、収集された診断は、バグ・レポートとともに提出できるzipファイルに保存されます。診断ファイルの保存場所を示すメッセージがコンソールに出力されます:Graal diagnostic output saved in /Users/graal/graal_dumps/1549459528316/graal_diagnostics_22774.zip
ExitVM
:Diagnose
と同じですが、再試行後にVMプロセスは終了します。
ExitVM
以外のすべての値の場合、VMは実行を続行します。 -Dgraal.CompilationBailoutAsFailure=false
: メソッドの一部のプロパティまたはコード・シェイプ(jsrおよびretバイトコードの通常とは異なる使用など)が原因で、コンパイラがメソッドのコンパイルを完了しない場合があります。この場合、コンパイルは中断します。このような中断についての通知が必要な場合、このオプションを指定すると、GraalVMはベイルアウトを障害として処理するため、-Dgraal.CompilationFailureAction
オプションで指定されたアクションの対象になります。-Dgraal.PrintCompilation=false
: 完了したコンパイルごとに情報行をコンソールに出力します。たとえば:HotSpotCompilation-11 Ljava/lang/Object; wait ()V | 591ms 12B 92B 4371kB HotSpotCompilation-175 Ljava/lang/String; lastIndexOf (II)I | 590ms 126B 309B 4076kB HotSpotCompilation-184 Ljava/util/concurrent/ConcurrentHashMap; setTabAt ([Ljava/util/concurrent/ConcurrentHashMap$Node;ILjava/util/concurrent/ConcurrentHashMap$Node;)V | 591ms 38B 67B 3411kB HotSpotCompilation-136 Lsun/nio/cs/UTF_8$Encoder; encode ([CII[B)I | 591ms 740B 418B 4921
言語ランチャでのコンパイラ・オプションの設定
前述のGraalコンパイラ・プロパティは、node
、js
、lli
などのその他のいくつかのGraalVMランチャで使用できます。プロパティを指定するための接頭辞は若干異なります。たとえば:
java -XX:+EagerJVMCI -Dgraal.ShowConfiguration=info -version
次のようになります:
js --jvm --vm.Dgraal.ShowConfiguration=info -version
-D
接頭辞は--vm.D
に置き換えられます。