ヘッダーをスキップ
Java Platform, Standard Edition Java Flight Recorderランタイム・ガイド
リリース5.5
E59385-02
  目次へ移動
目次

前
 
次
 

2 Java Flight Recorderの実行

この章では、Java Flight Recorderを実行する方法について説明します。


注意:

Java Flight Recorderを本番で使用するには、商用ライセンスが必要です。商用機能の詳細とそれらを有効化する方法については、http://www.oracle.com/technetwork/java/javaseproducts/にアクセスしてください。

複数の記録を同時に実行し、各記録を異なる設定を使って構成できます。特に、記録ごとに異なるイベント・セットがキャプチャされるように構成できます。ただし、Java Flight Recorderの内部ロジックをできるだけ簡素化するために、結果の記録には常に、その時点でアクティブになっていたすべての記録のすべてのイベントの和集合が含まれます。これは、複数の記録が実行中の場合、必要だった情報より多くなる可能性があることを意味しています。これが混乱をまねく場合がありますが、それ以外の負の影響はありません。

JFRを使用するための最も簡単で、最も直感的な方法は、Java Mission Controlに統合されているFlight Recorderプラグインを使用することです。このプラグインを使用すると、直感的なGUIからJFR機能にアクセスできます。JMCクライアントを使用してJFRを制御する方法の詳細は、Java Mission ControlヘルプのFlight Recorderプラグインに関するセクションを参照してください。

この章では、JFR記録を実行および管理するためのより高度な方法について説明します。この章は、次のセクションで構成されています。

2.1コマンド行の使用

フライト記録を作成する前に、最初に商用機能をロック解除してJava Flight Recorderを有効化する必要があります。これを行うには、javaコマンド行オプション、jcmd診断コマンド、Java Mission Control内のグラフィカル・ユーザー・インタフェース(GUI)・コントロールなど、様々な方法があります。この柔軟性によって、起動時に適切なオプションを指定することも、JVMが実行された後でJFRと対話することもできます。

次の例では、javaコマンド行オプションを使用してMyAppを実行し、すぐに60秒間の記録を開始します。記録は、myrecording.jfrという名前のファイルに保存されます。

java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:StartFlightRecording=duration=60s,filename=myrecording.jfr MyApp

サポートされるコマンド行オプションの詳細は、付録A「コマンド行オプション」を参照してください。

2.2 診断コマンドの使用方法

記録は、jcmdおよびJFR固有の診断コマンドを使用して制御できます。診断コマンドの詳細は、付録A、「診断コマンド・リファレンス」を参照してください。

診断コマンドを実行するもっとも単純な方法は、(Javaインストール・ディレクトリにある) jcmdツールを使用することです。コマンドを発行するには、JVMのプロセス識別子(またはメイン・クラスの名前)と実際のコマンドを、jcmdの引数として渡す必要があります。

たとえば、識別子が5368の実行中Javaプロセスで60秒間の記録を開始し、それを現在のディレクトリのmyrecording.jfrに保存するには、次を使用します。

jcmd 5368 JFR.start duration=60s filename=myrecording.jfr

実行中のすべてのJavaプロセスの一覧を表示するには、引数なしでjcmdコマンドを実行します。実行中Javaアプリケーションで使用可能なコマンドの完全な一覧を表示するには、プロセス識別子(またはメイン・クラスの名前)の後に診断コマンドとしてhelpを指定します。

次の例は、MyApp.jarに存在するデモ・プログラムについて、Java Flight Recorderでjcmdを実行する場合の様々な使用例を示しています。

例2-1 jcmdを使用した動的対話

例2-1では、商用機能をロック解除し、実行時に動的にJava Flight Recorderを有効化します。Javaアプリケーションの起動時に特別なオプションは指定されません。JVMが実行されると、jcmdコマンドのVM.unlock_commercial_featuresおよびJFR.startが使用され、商用機能がロック解除されて新しいフライト記録が開始されます。

$java -jar MyApp.jar
$jcmd 40019 VM.command_line
40019:
VM Arguments:
java_command: MyApp.jar
java_class_path (initial): MyApp.jar
Launcher Type: SUN_STANDARD

$jcmd 40019 VM.check_commercial_features
40019:
Commercial Features are locked.

$jcmd 40019 JFR.check
40019:
Java Flight Recorder not enabled.

Use VM.unlock_commercial_features to enable.

$jcmd 40019 VM.unlock_commercial_features
40019:
Commercial Features now unlocked.

$jcmd 40019 VM.check_commercial_features
40019:
Commercial Features are unlocked.
Status of individual features:
Java Flight Recorder has not been used.
Resource Management is disabled.

$jcmd 40019 JFR.check
40019:

No available recordings.

Use JFR.start to start a recording.

$jcmd 40019 JFR.start name=my_recording filename=myrecording.jfr dumponexit=true
40019:
Started recording 1. No limit (duration/maxsize/maxage) in use.

Use JFR.dump name=my_recording to copy recording data to file.

$jcmd 40019 VM.check_commercial_features
40019:
Commercial Features are unlocked.
Status of individual features:
Java Flight Recorder has been used.
Resource Management is disabled.

$jcmd 40019 JFR.check
40019:
Recording: recording=1 name="my_recording" filename="myrecording.jfr" compress=false (running)

$

例2-2 -XX:+UnlockCommercialFeaturesおよび-XX:+FlightRecorderの使用

例2-2では、商用機能をロック解除してJFRを有効化するために、アプリケーションの起動時にjavaコマンドに-XX:+UnlockCommercialFeaturesオプションと-XX:+FlightRecorderオプションを渡します。

$java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -jar MyApp.jar

$jcmd 37152 VM.command_line
37152:
VM Arguments:
jvm_args: -XX:+UnlockCommercialFeatures -XX:+FlightRecorder
java_command: MyApp.jar
java_class_path (initial): MyApp.jar
Launcher Type: SUN_STANDARD
$jcmd 37152 VM.check_commercial_features
37152:
Commercial Features are unlocked.
Status of individual features:
Java Flight Recorder has not been used.
Resource Management is disabled.

$jcmd 37152 JFR.check
37152:
No available recordings.

Use JFR.start to start a recording.

$jcmd 37152 JFR.start name=my_recording filename=myrecording.jfr dumponexit=true
37152:
Started recording 1. No limit (duration/maxsize/maxage) in use.

Use JFR.dump name=my_recording to copy recording data to file.


$jcmd 37152 JFR.check
37152:
Recording: recording=1 name="my_recording" filename="myrecording.jfr" compress=false (running)

$jcmd 37152 VM.check_commercial_features
37152:
Commercial Features are unlocked.
Status of individual features:
Java Flight Recorder has been used.
Resource Management is disabled.
$

例2-3 JFR動的起動での-XX:+UnlockCommercialFeaturesの使用

例2-3では、-XX:+UnlockCommercialFeaturesを使用してアプリケーションを起動した後に、JFR.startを使用してJFRを動的に起動します。

$java -XX:+UnlockCommercialFeatures -jar MyApp.jar

$jcmd 39970 VM.command_line
39970:
VM Arguments:
jvm_args: -XX:+UnlockCommercialFeatures
java_command: MyApp.jar
java_class_path (initial): MyApp.jar
Launcher Type: SUN_STANDARD

$jcmd 39970 VM.check_commercial_features
39970:
Commercial Features are unlocked.
Status of individual features:
Java Flight Recorder has not been used.
Resource Management is disabled.

$jcmd 39970 JFR.check
39970:
No available recordings.

Use JFR.start to start a recording.

$jcmd 39970 VM.check_commercial_features
39970:
Commercial Features are unlocked.
Status of individual features:
Java Flight Recorder has not been used.
Resource Management is disabled.

$jcmd 39970 JFR.start name=my_recording filename=myrecording.jfr dumponexit=true

39970:

Started recording 1. No limit (duration/maxsize/maxage) in use.

Use JFR.dump name=my_recording to copy recording data to file.

$jcmd 39970 VM.check_commercial_features

39970:

Commercial Features are unlocked.
Status of individual features:
Java Flight Recorder has been used.
Resource Management is disabled.

$jcmd 39970 JFR.check
39970:
Recording: recording=1 name="my_recording" filename="myrecording.jfr" compress=false (running)
$

例2-4 -XX:-UnlockCommercialFeaturesによる商用機能のロック

例2-4では、商用機能を明示的にロックしたまま(-XX:-UnlockCommercialFeatures)アプリケーションを起動します。その後、VM.unlock_commercial_featuresを使用して商用機能をロック解除し、JFR.startを使用して新しいフライト記録を開始します。

$ java -XX:-UnlockCommercialFeatures -jar MyApp.jar

$jcmd 40110 VM.command_line
40110:
VM Arguments:
jvm_args: -XX:-UnlockCommercialFeatures
java_command: MyApp.jar
java_class_path (initial): MyApp.jar
Launcher Type: SUN_STANDARD

$jcmd 40110 VM.check_commercial_features
40110:
Commercial Features are locked.

$jcmd 40110 VM.unlock_commercial_features
40110:
Commercial Features now unlocked.

$jcmd 40110 VM.check_commercial_features
40110:
Commercial Features are unlocked.
Status of individual features:
Java Flight Recorder has not been used.
Resource Management is disabled.

$jcmd 40110 JFR.start name=my_recording filename=myrecording.jfr dumponexit=true
40110:
Started recording 1. No limit (duration/maxsize/maxage) in use.

Use JFR.dump name=my_recording to copy recording data to file.

$jcmd 40110 JFR.check
40110:
Recording: recording=1 name="my_recording" filename="myrecording.jfr" compress=false (running)

$jcmd 40110 VM.check_commercial_features
40110:
Commercial Features are unlocked.
Status of individual features:
Java Flight Recorder has been used.
Resource Management is disabled.$

例2-5 -XX:-FlightRecorderによるJFRの無効化

例2-5では、JFRを完全に無効化するために、アプリケーションの起動時にjavaコマンドに-XX:-FlightRecorderを渡します。このオプションが指定されている場合、新しいフライト記録を動的に作成することはできません。

$java -XX:+UnlockCommercialFeatures -XX:-FlightRecorder -jar MyApp.jar
$jcmd 39589 VM.command_line
39589:
VM Arguments:
jvm_args: -XX:+UnlockCommercialFeatures -XX:-FlightRecorder
java_command: MyApp.jar
java_class_path (initial): MyApp.jar
Launcher Type: SUN_STANDARD

$jcmd 39589 VM.check_commercial_features

39589:
Commercial Features are unlocked.
Status of individual features:
Java Flight Recorder is disabled.
Resource Management is disabled.

$jcmd 39589 JFR.check
39589:
Java Flight Recorder is disabled.

$jcmd 39589 JFR.stop
39589:
Java Flight Recorder is disabled.

$jcmd 39589 VM.unlock_commercial_features
39589:
Commercial Features already unlocked.

$jcmd 39589 JFR.start name=my_recording filename=myrecording.jfr dumponexit=true
39589:
Java Flight Recorder is disabled.
$

例2-6 無効なオプションの組合せ

例2-6は、無効なオプションの組合せがjavaコマンドに渡された場合に何が起こるかを示しています。この場合、ユーザーは、商用機能をロックしながら(-XX:-UnlockCommercialFeatures) JFRを有効化しようとしています(-XX:+FlightRecorder)。

$ java -XX:-UnlockCommercialFeatures -XX:+FlightRecorder -jar MyApp.jar
Error: To use 'FlightRecorder', first unlock using -XX:+UnlockCommercialFeatures.
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
$

2.3 記録の構成

明示的記録はほかにもいくつか方法で構成できます。これらの手法は、記録の開始方法(つまり、コマンド行アプローチを使用する方法、または診断コマンドを使用する方法)に関係なく同じように機能します。

2.3.1最大サイズや最大有効期間の設定

明示的記録が最大サイズや最大有効期間を持つように構成するには、次のパラメータを使用します。

  • maxsize=size
    

    キロバイトを示す文字kまたはK、メガバイトを示すmまたはM、ギガバイトを示すgまたはGを末尾に付加しますが、サイズをバイトで設定する場合は接尾辞を指定しないでください。

  • maxage=age
    

    秒を示す文字s、分を示すm、時を示すh、または日を示すdを末尾に付加します。

サイズと有効期間の両方の制限が指定された場合、どちらかの制限に達した時点でデータが削除されます。

2.3.2 遅延の設定

記録をスケジューリングする際には、実際に記録が開始されるまでの遅延を追加したい場合があります。たとえば、コマンド行から実行する場合に、アプリケーションがブートするか安定した状態に達してから記録を開始するのが望ましいといった場合です。これを実現するには、delayパラメータを使用します。

delay=delay

秒を示す文字s、分を示すm、時を示すh、または日を示すdを末尾に付加します。

2.3.3 圧縮の設定

記録ファイルの形式は非常にコンパクトですが、さらに圧縮するにはZIPアーカイブに追加します。圧縮を有効にするには、次のパラメータを使用します。

compress=true

圧縮にはCPUリソースが必要となるため、パフォーマンスに負の影響が及ぶ可能性があります。

2.4記録の自動作成

デフォルト記録で実行する場合、特定の条件が満たされるたびに現在のインメモリー記録データがファイルに自動保存されるように、Java Flight Recorderを構成できます。ディスク・リポジトリを使用する場合は、ディスク・リポジトリ内の現在の情報も含められます。

2.4.1終了時の記録の作成

JVMが終了するたびに記録データを指定されたパスに保存するには、次のオプションでアプリケーションを起動します。

-XX:FlightRecorderOptions=defaultrecording=true,dumponexit=true,dumponexitpath=path

pathは、記録を保存すべき場所に設定します。ディレクトリを指定した場合、そのディレクトリ内に、日付と時間を名前に持つファイルが作成されます。ファイル名を指定した場合は、その名前が使用されます。パスを指定しなかった場合は、現在のディレクトリに記録が保存されます。

-XX:StartFlightRecordingオプションのパラメータとしてdumponexit=trueを指定することもできます。

-XX:StartFlightRecording=name=test,filename=D:\test.jfr,dumponexit=true

この場合、ダンプ・ファイルは、filenameパラメータで定義された場所に書き込まれます。

2.4.2トリガーを使用した記録の作成

Java Mission Controlのコンソールを使用してトリガーを設定できます。トリガーとは、ルールによって指定される条件が真になるたびにアクションを実行するルールのことです。たとえば、ヒープ・サイズが100 MBを超えるたびにフライト記録が開始されるルールを作成できます。Java Mission Controlのトリガーは、JMX MBean経由で公開されたプロパティをルールへの入力として使用できます。これらは、フライト・レコーダ・ダンプだけでなく、その他のさまざまなアクションを起動できます。

トリガーは、JMXコンソールの「トリガー」タブで定義します。トリガーを作成する方法の詳細は、Java Mission Controlのヘルプを参照してください。

2.5 セキュリティ

記録ファイルには、Javaコマンド行オプションや環境変数などの機密情報が含まれる可能性があります。記録ファイルの格納や転送を行う際には、診断コア・ファイルやヒープ・ダンプの場合と同様に細心の注意を払ってください。

表2-1では、JFRを使用する様々な方法に対するセキュリティ権限について説明します。

表2-1 セキュリティ権限

方法 セキュリティ

コマンド行

Javaプロセスのコマンド行にアクセスできるすべての人が信頼されている必要があります。

診断コマンド

Javaプロセスの所有者のみがjcmdを使ってプロセスを制御できます。

Java Mission Controlクライアント

Java Mission ControlクライアントはJMXを使ってJVMにアクセスします。


2.6 トラブルシューティング

Java Flight Recorderから大量の診断情報を収集するには、次のオプションのいずれかでJVMを起動します。

  • -XX:FlightRecorderOptions=loglevel=debug

  • -XX:FlightRecorderOptions=loglevel=trace.