ディレクティブ・ファイルを操作するためのコマンド

このトピックでは、各種コマンドに加え、作成したディレクティブ・ファイルを操作することによる影響について確認します。

コンパイラ・ディレクティブとコマンドライン

コマンドライン・インタフェースを使用して、プログラムの起動時にコンパイラ・ディレクティブを追加および出力できます。

コマンド・ラインで指定できるのは、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)番号を見つける必要があります。

  1. ターミナルを開きます。
  2. jcmdコマンドを入力します。
jcmdコマンドは、実行中のJavaプロセスのリスト、およびそれらのPID番号を返します。次の例では、TestProgramについての情報が返されます。
11084 TestProgram

診断コマンドによるディレクティブの追加

次の診断コマンドを使用して、ファイル内のすべてのディレクティブをディレクティブ・スタックに追加できます。

構文:
jcmd pid Compiler.directives_add file
次の例に、診断コマンドを示します。
jcmd 11084 Compiler.directives_add File_B.json
ターミナルは、追加された個々のディレクティブの数を報告します。ディレクティブ・ファイルに構文エラーまたは不正なディレクティブがある場合はエラー・メッセージが表示され、そのファイル内のディレクティブはスタックに追加されず、実行中のプログラムに変更は加えられません。

診断コマンドによるディレクティブの削除

診断コマンドを使用してディレクティブを削除できます。

ディレクティブ・スタックから最上位のディレクティブを1つ削除するには、次のように入力します。
jcmd pid Compiler.directives_remove
追加したディレクティブをディレクティブ・スタックからクリアするには、次のように入力します。
jcmd pid Compiler.directives_clear
ファイル全体のディレクティブを指定して削除することや、ディレクティブをまとめて削除することはできません。

診断コマンドによるディレクティブの出力

診断コマンドを使用して、実行中のプログラムのディレクティブ・スタックを出力できます。

ディレクティブ・スタック全体の詳細な説明を出力するには、次のように入力します。
jcmd pid Compiler.directives_print
出力の例は、デフォルト・ディレクティブとはに示されています。

ディレクティブ・スタック内のディレクティブの順序

ディレクティブ・ファイル内のディレクティブの順序は非常に重要です。スタック内の最上位にある一致度の高いディレクティブが優先され、コードのコンパイルに適用されます。

次の例は、例のディレクティブ・スタック内のディレクティブ・ファイルの順序を示しています。この例のディレクティブ・ファイルには、次のディレクティブが含まれます。

  • File_Aには、Directive 1Directive 2が含まれます。

  • File_Bには、Directive 3が含まれます。

  • File_Cには、Directive 4Directive 5が含まれます。

ディレクティブありまたはなしでアプリケーションを起動

ディレクティブ・ファイルを指定せずにTestProgramを起動できます。
  • ディレクティブを追加せずにTestProgramを起動するには、コマンドラインで次のコマンドを入力します。
    java TestProgram
  • TestProgramは、ディレクティブ・ファイルの指定なしで起動します。

  • デフォルト・ディレクティブは、常にディレクティブ・スタック内の最下部のディレクティブです。図2-1には、デフォルト・ディレクティブがDirective 0として示されています。ディレクティブ・ファイルを指定しない場合、デフォルト・ディレクティブは最上位のディレクティブとして優先されます。

図2-1 ディレクティブなしのプログラムの起動

図2-1の説明が続きます
「図2-1 ディレクティブなしのプログラムの起動」の説明
アプリケーションを起動して、ディレクティブを指定できます。
  • TestProgramアプリケーションを起動して、File_A.jsonのディレクティブをディレクティブ・スタックに追加するには、コマンドラインで次のコマンドを入力します。
    java -XX:+UnlockDiagnosticVMOptions -XX:CompilerDirectivesFile=File_A.json TestProgram
  • TestProgramが起動し、File_Aのディレクティブがスタックに追加されます。ディレクティブ・ファイル内の最上位のディレクティブがディレクティブ・スタック内の最上位のディレクティブになります。

  • 図2-2は、スタック内のディレクティブの順序が上から順に[1, 2, 0]となることを示しています。

図2-2 ディレクティブありのプログラムの起動

図2-2の説明が続きます
「図2-2 ディレクティブありのプログラムの起動」の説明

実行中のアプリケーションへのディレクティブの追加

診断コマンドを使用して、実行中のアプリケーションにディレクティブを追加できます。
  • File_Bのすべてのディレクティブをディレクティブ・スタックに追加するには、次のコマンドを入力します。
    jcmd 11084 Compiler.directives_add File_B.json

    File_Bのディレクティブがスタックの最上位に追加されます。

  • 図2-3は、スタック内のディレクティブの順序が[3, 1, 2, 0]となることを示しています。

図2-3 実行中のプログラムへのディレクティブの追加

図2-3の説明が続きます
「図2-3 実行中のプログラムへのディレクティブの追加」の説明
次のように、診断コマンドを使用して、実行中のTestProgramにディレクティブ・ファイルを追加できます。
  • File_Cのすべてのディレクティブをディレクティブ・スタックに追加するには、次のコマンドを入力します。
    jcmd 11084 Compiler.directives_add File_C.json
  • 図2-4は、スタック内のディレクティブの順序が[4, 5, 3, 1, 2, 0]となることを示しています。

図2-4 実行中のプログラムへの多数のディレクティブの追加

図2-4の説明が続きます
「図2-4 実行中のプログラムへの多数のディレクティブの追加」の説明

ディレクティブ・スタックからのディレクティブの削除

診断コマンドを使用して、ディレクティブ・スタックの最上位のディレクティブを削除できます。
  • スタックからDirective 4を削除するには、次のコマンドを入力します。
    jcmd 11084 Compiler.directives_remove
  • さらに削除するには、この診断コマンドを、デフォルトのディレクティブのみが残るまで繰り返します。デフォルト・ディレクティブは削除できません。

  • 図2-5は、スタック内のディレクティブの順序が[5, 3, 1, 2, 0]となることを示しています。

図2-5 スタックからの1つのディレクティブの削除

図2-5の説明が続きます
「図2-5 スタックからの1つのディレクティブの削除」の説明
複数のディレクティブをディレクティブ・スタックから削除できます。
  • ディレクティブ・スタックをクリアするには、次のコマンドを入力します。
    jcmd 11084 Compiler.directives_clear
  • デフォルト・ディレクティブを除くすべてのディレクティブが削除されます。デフォルト・ディレクティブは削除できません。

  • 図2-6は、Directive 0のみがスタック内に残っていることを示しています。

図2-6 スタックからのすべてのディレクティブの削除

図2-6の説明が続きます
「図2-6 スタックからのすべてのディレクティブの削除」の説明