このトピックでは、各種コマンドに加え、作成したディレクティブ・ファイルを操作することによる影響について確認します。
コマンドラインは、プログラムの起動時にコンパイラ・ディレクティブを追加および出力するインタフェースを提供します。
コマンドラインから指定できるのは、1つのディレクティブ・ファイルのみです。そのファイル内のすべてのディレクティブはディレクティブ・スタックに追加され、プログラムが起動すると即座にアクティブになります。これにより、プログラムの初期段階にディレクティブのパフォーマンスの影響をテストできます。また、プログラムのデバッグと開発に集中することもできます。
コマンドラインからのディレクティブの追加
XX:CompilerDirectivesFile=file
このコマンドライン・オプションは、Javaプログラムを起動する際に含めます。これを次の例に示します(TestProgram
を起動する例)。java -XX:+UnlockDiagnosticVMOptions -XX:CompilerDirectivesFile=File_A.json TestProgram
-XX:+UnlockDiagnosticVMOptions
は、診断オプションを有効にします。これは、コマンドラインでディレクティブを操作する前に入力してください。
-XX:CompilerDirectivesFile
は、診断オプションのタイプです。ディレクティブ・スタックに追加するディレクティブ・ファイルを1つ指定します。
File_A.json
は、ディレクティブ・ファイルです。これには任意の数のディレクティブが含まれ、それらすべてがプログラムの起動時にディレクティブ・スタックに追加されます。
File_A.json
に構文エラーまたは不正なディレクティブがある場合はエラー・メッセージが表示され、TestProgram
は起動されません。
コマンドラインからのディレクティブの出力
-XX:+CompilerDirectivesPrintこの診断コマンドをコマンドラインに含める例を次に示します。
java -XX:+UnlockDiagnosticVMOptions -XX:+CompilerDirectivesPrint -XX:CompilerDirectivesFile=File_A.json TestProgram
診断コマンドは、実行時にアクティブになるディレクティブを管理するインタフェースを提供します。実行中のプログラムに対するディレクティブの追加と削除をプログラムの再起動なしで行うことができます。
1つの完全なディレクティブ・ファイルを作成するには、なんらかの反復と実験が必要になることがあります。しかし、診断コマンドには、ディレクティブ・スタック内のディレクティブの異なる構成をテストするための強力なメカニズムが用意されています。診断コマンドを使用すると、実行中のプログラムのJVMを再起動することなく、ディレクティブの追加や削除を行うことができます。
ディレクティブをテストするための最初の手順は、実行中のプログラムのプロセス識別(pid)番号を特定することです。
TestProgram
について次のような情報が返されます。11084 TestProgram
ファイル内のすべてのディレクティブは、1つの診断コマンドを介してディレクティブ・スタックに追加されます。
jcmd pid Compiler.directives_add file次に例を示します。
jcmd 11084 Compiler.directives_add File_B.jsonターミナルは、追加された個々のディレクティブの数を報告します。ただし、ディレクティブ・ファイルに構文エラーまたは不正なディレクティブがある場合はエラー・メッセージが表示され、ファイル内のディレクティブはスタックに追加されません。実行中のプログラムに変更はありません。
ディレクティブを削除する診断コマンドは2つあります。
jcmd pid Compiler.directives_remove
追加したディレクティブをディレクティブ・スタックから消去するには、次のように入力します。jcmd pid Compiler.directives_clear
ファイル全体のディレクティブを指定して削除することや、ディレクティブをまとめて削除することはできません。実行中のプログラムのディレクティブ・スタックを出力するには、診断コマンドを使用します。
jcmd pid Compiler.directives_print
出力の例は、デフォルト・ディレクティブとはに示されています。ディレクティブをファイルに書き込む順序、スタックに追加する順序は非常に重要です。スタック内の最上位にある一致度の高いディレクティブが優先され、コードのコンパイルに適用されます。
このトピックの図は、ディレクティブ・スタックの例における順序の影響を示しています。このシナリオには、次の3つのディレクティブ・ファイルがあります。
File_A
には、Directive 1
とDirective 2
が含まれます。
File_B
には、Directive 3
が含まれます。
File_C
には、Directive 4
とDirective 5
が含まれます。
ディレクティブ・スタックの初期状態
TestProgram
は、ディレクティブ・ファイルを使用せずに起動できます。java TestProgram
TestProgram
は、ディレクティブ・ファイルの指定なしで起動します。
デフォルト・ディレクティブは常にディレクティブ・スタックの最下部にあります。図2-1には、デフォルト・ディレクティブがDirective 0
として示されています。ディレクティブ・ファイルを指定しない場合、デフォルト・ディレクティブは最上位のディレクティブとして優先されます。
TestProgram
を起動するときに、ディレクティブをディレクティブ・スタックに追加できます。File_A.json
のすべてのディレクティブをディレクティブ・スタックに追加するには、コマンドラインで次のように入力します。 java -XX:+UnlockDiagnosticVMOptions -XX:CompilerDirectivesFile=File_A.json TestProgram
ディレクティブは、書き込まれた順序とは逆の順序でスタックに追加されます。ファイル内の最上位のディレクティブがスタック内の最上位のディレクティブになります。
図2-2は、スタック内のディレクティブの順序が上から順に[1, 2, 0]となることを示しています。
ディレクティブ・スタックへの追加
TestProgram
が実行中の場合は、診断コマンドを使用して追加のディレクティブを指定する必要があります。File_B
のすべてのディレクティブをディレクティブ・スタックに追加するには、次のように入力します。jcmd 11084 Compiler.directives_add File_B.json
Directive 3
は、スタックの最上位に追加されます。これは、File_B
にある唯一のディレクティブです。
図2-3は、スタック内のディレクティブの順序が[3, 1, 2, 0]となることを示しています。
TestProgram
が引き続き実行中であれば、診断コマンドを使用してさらにディレクティブ・ファイルを追加できます。File_C
のすべてのディレクティブをディレクティブ・スタックに追加するには、次のように入力します。 jcmd 11084 Compiler.directives_add File_C.json
図2-4は、スタック内のディレクティブの順序が[4, 5, 3, 1, 2, 0]となることを示しています。
ディレクティブ・スタックからの削除
Directive 4
をスタックから削除するには、次のように入力します。jcmd 11084 Compiler.directives_remove
デフォルト・ディレクティブが残っているかぎり、最上位のディレクティブは1度に1つずつ削除できます。デフォルト・ディレクティブは削除できません。
図2-5は、スタック内のディレクティブの順序が[5, 3, 1, 2, 0]となることを示しています。
jcmd 11084 Compiler.directives_clear
デフォルト・ディレクティブを除くすべてのディレクティブが1度に削除されます。デフォルト・ディレクティブは削除できません。
図2-6は、Directive 0
のみがスタック内に残っていることを示しています。