ディレクティブ・ファイルを操作するためのコマンド
このトピックでは、各種コマンドに加え、作成したディレクティブ・ファイルを操作することによる影響について確認します。
コンパイラ・ディレクティブとコマンドライン
コマンドライン・インタフェースを使用して、プログラムの起動時にコンパイラ・ディレクティブを追加および出力できます。
コマンド・ラインで指定できるのは、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を再起動することなく、ディレクティブの追加や削除を行うことができます。
Javaプロセス識別番号の取得
ディレクティブをテストするには、実行中のプログラムのプロセッサ識別子(PID)番号を見つける必要があります。
- ターミナルを開きます。
- jcmdコマンドを入力します。
jcmd
コマンドは、実行中のJavaプロセスのリスト、およびそれらのPID番号を返します。次の例では、TestProgram
についての情報が返されます。11084 TestProgram
診断コマンドによるディレクティブの追加
次の診断コマンドを使用して、ファイル内のすべてのディレクティブをディレクティブ・スタックに追加できます。
jcmd pid Compiler.directives_add file
次の例に、診断コマンドを示します。jcmd 11084 Compiler.directives_add File_B.json
ターミナルは、追加された個々のディレクティブの数を報告します。ディレクティブ・ファイルに構文エラーまたは不正なディレクティブがある場合はエラー・メッセージが表示され、そのファイル内のディレクティブはスタックに追加されず、実行中のプログラムに変更は加えられません。診断コマンドによるディレクティブの削除
診断コマンドを使用してディレクティブを削除できます。
jcmd pid Compiler.directives_remove
追加したディレクティブをディレクティブ・スタックからクリアするには、次のように入力します。jcmd pid Compiler.directives_clear
ファイル全体のディレクティブを指定して削除することや、ディレクティブをまとめて削除することはできません。診断コマンドによるディレクティブの出力
診断コマンドを使用して、実行中のプログラムのディレクティブ・スタックを出力できます。
jcmd pid Compiler.directives_print
出力の例は、デフォルト・ディレクティブとはに示されています。ディレクティブ・スタック内のディレクティブの順序
ディレクティブ・ファイル内のディレクティブの順序は非常に重要です。スタック内の最上位にある一致度の高いディレクティブが優先され、コードのコンパイルに適用されます。
次の例は、例のディレクティブ・スタック内のディレクティブ・ファイルの順序を示しています。この例のディレクティブ・ファイルには、次のディレクティブが含まれます。
-
File_A
には、Directive 1
とDirective 2
が含まれます。 -
File_B
には、Directive 3
が含まれます。 -
File_C
には、Directive 4
とDirective 5
が含まれます。
ディレクティブありまたはなしでアプリケーションを起動
TestProgram
を起動できます。
-
ディレクティブを追加せずに
TestProgram
を起動するには、コマンドラインで次のコマンドを入力します。java TestProgram
-
TestProgram
は、ディレクティブ・ファイルの指定なしで起動します。 -
デフォルト・ディレクティブは、常にディレクティブ・スタック内の最下部のディレクティブです。図2-1には、デフォルト・ディレクティブが
Directive 0
として示されています。ディレクティブ・ファイルを指定しない場合、デフォルト・ディレクティブは最上位のディレクティブとして優先されます。
-
TestProgram
アプリケーションを起動して、File_A.json
のディレクティブをディレクティブ・スタックに追加するには、コマンドラインで次のコマンドを入力します。java -XX:+UnlockDiagnosticVMOptions -XX:CompilerDirectivesFile=File_A.json TestProgram
-
TestProgram
が起動し、File_A
のディレクティブがスタックに追加されます。ディレクティブ・ファイル内の最上位のディレクティブがディレクティブ・スタック内の最上位のディレクティブになります。 -
図2-2は、スタック内のディレクティブの順序が上から順に[1, 2, 0]となることを示しています。
実行中のアプリケーションへのディレクティブの追加
-
File_B
のすべてのディレクティブをディレクティブ・スタックに追加するには、次のコマンドを入力します。jcmd 11084 Compiler.directives_add File_B.json
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
-
さらに削除するには、この診断コマンドを、デフォルトのディレクティブのみが残るまで繰り返します。デフォルト・ディレクティブは削除できません。
-
図2-5は、スタック内のディレクティブの順序が[5, 3, 1, 2, 0]となることを示しています。
-
ディレクティブ・スタックをクリアするには、次のコマンドを入力します。
jcmd 11084 Compiler.directives_clear
-
デフォルト・ディレクティブを除くすべてのディレクティブが削除されます。デフォルト・ディレクティブは削除できません。
-
図2-6は、
Directive 0
のみがスタック内に残っていることを示しています。