プライマリ・コンテンツに移動
Java Platform, Standard Edition Java仮想マシン・ガイド
リリース9
E90919-02
目次へ移動
目次

前
次

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

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

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

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

コマンドラインから指定できるのは、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と入力します。
このコマンドは、マシン上で実行されている各Javaプロセスとそのpid番号のリストを返します。たとえば、TestProgramについて次のような情報が返されます。
11084 TestProgram

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

ファイル内のすべてのディレクティブは、1つの診断コマンドを介してディレクティブ・スタックに追加されます。

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

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

ディレクティブを削除する診断コマンドは2つあります。

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

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

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

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

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

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

このトピックの図は、ディレクティブ・スタックの例における順序の影響を示しています。このシナリオには、次の3つのディレクティブ・ファイルがあります。

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

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

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

ディレクティブ・スタックの初期状態

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
  • ディレクティブは、書き込まれた順序とは逆の順序でスタックに追加されます。ファイル内の最上位のディレクティブがスタック内の最上位のディレクティブになります。

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

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

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

ディレクティブ・スタックへの追加

TestProgramが実行中の場合は、診断コマンドを使用して追加のディレクティブを指定する必要があります。
  • File_Bのすべてのディレクティブをディレクティブ・スタックに追加するには、次のように入力します。
    jcmd 11084 Compiler.directives_add File_B.json
  • Directive 3は、スタックの最上位に追加されます。これは、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
  • デフォルト・ディレクティブが残っているかぎり、最上位のディレクティブは1度に1つずつ削除できます。デフォルト・ディレクティブは削除できません。

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

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

図2-5の説明が続きます
「図2-5 スタックからの1つのディレクティブの削除」の説明
ディレクティブ・スタックからディレクティブを一括削除するメカニズムが1つあります。
  • ディレクティブ・スタックを消去するには、次のように入力します。
    jcmd 11084 Compiler.directives_clear
  • デフォルト・ディレクティブを除くすべてのディレクティブが1度に削除されます。デフォルト・ディレクティブは削除できません。

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

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

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