ディレクティブ・ファイルを操作するためのコマンド
このトピックでは、各種コマンドに加え、作成したディレクティブ・ファイルを操作することによる影響について確認します。
コンパイラ・ディレクティブとコマンドライン
コマンドライン・インタフェースを使用して、プログラムの起動時にコンパイラ・ディレクティブを追加および出力できます。
コマンド・ラインで指定できるのは、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.jsonFile_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のみがスタック内に残っていることを示しています。





