この章では、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記録を実行および管理するためのより高度な方法について説明します。この章は、次のセクションで構成されています。
コマンド行から記録を開始したり構成したりするには、アプリケーションの起動時にjava
コマンドの-XX:StartFlightRecording
オプションを使用します。JFRの使用を有効化するには、-XX:+FlightRecorder
オプションを指定します。JFRは商用の機能なので、-XX:+UnlockCommercialFeatures
オプションも指定する必要があります。次の例は、MyApp
アプリケーションを実行し、すぐに60秒間の記録を開始し、それをmyrecording.jfr
という名前のファイルに保存する方法を示しています。
java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:StartFlightRecording=duration=60s,filename=myrecording.jfr MyApp
JFRを構成するには、-XX:FlightRecorderOptions
オプションを使用できます。詳細は、付録A、「コマンド行オプション」を参照してください。
Java固有の診断コマンドを使って記録を制御することもできます。診断コマンドの詳細は、付録A、「診断コマンド・リファレンス」を参照してください。
診断コマンドを実行するもっとも単純な方法は、(Javaインストール・ディレクトリにある) jcmd
ツールを使用することです。コマンドを発行するには、JVMのプロセス識別子(またはメイン・クラスの名前)と実際のコマンドを、jcmd
の引数として渡す必要があります。たとえば、識別子が5368の実行中Javaプロセスで60秒間の記録を開始し、それを現在のディレクトリのmyrecording.jfr
に保存するには、次を使用します。
jcmd 5368 JFR.start duration=60s filename=myrecording.jfr
実行中のすべてのJavaプロセスの一覧を表示するには、引数なしでjcmd
コマンドを実行します。実行中Javaアプリケーションで使用可能なコマンドの完全な一覧を表示するには、プロセス識別子(またはメイン・クラスの名前)のあとに診断コマンドとしてhelp
を指定します。Java Flight Recorderに関連するコマンドです。
JFR.start
記録を開始します。
JFR.check
指定されたプロセスで実行されているすべての記録のステータス(記録ID番号、ファイル名、期間など)をチェックします。
JFR.stop
特定のID番号の記録を停止します(デフォルトでは記録1が停止されます)。
JFR.dump
特定のID番号の記録によってその時点までに収集されたデータをダンプします(デフォルトでは記録1のデータがダンプされます)。
注意: これらのコマンドが使用可能になるのは、Javaアプリケーションの起動時にJava Flight Recorderが有効化された場合、つまり次のオプションが使用された場合だけです。-XX:+UnlockCommercialFeatures -XX:+FlightRecorder |
明示的記録はほかにもいくつか方法で構成できます。これらの手法は、記録の開始方法(つまり、コマンド行アプローチを使用する方法、または診断コマンドを使用する方法)に関係なく同じように機能します。
明示的記録が最大サイズや最大有効期間を持つように構成するには、次のパラメータを使用します。
maxsize=size
キロバイトを示す文字k
またはK
、メガバイトを示すm
またはM
、ギガバイトを示すg
またはG
を末尾に付加しますが、サイズをバイトで設定する場合は接尾辞を指定しないでください。
maxage=age
秒を示す文字s
、分を示すm
、時を示すh
、または日を示すd
を末尾に付加します。
サイズと有効期間の両方の制限が指定された場合、どちらかの制限に達した時点でデータが削除されます。
記録をスケジューリングする際には、実際に記録が開始されるまでの遅延を追加したい場合があります。たとえば、コマンド行から実行する場合に、アプリケーションがブートするか安定した状態に達してから記録を開始するのが望ましいといった場合です。これを実現するには、delay
パラメータを使用します。
delay=delay
秒を示す文字s
、分を示すm
、時を示すh
、または日を示すd
を末尾に付加します。
記録ファイルの形式は非常にコンパクトですが、さらに圧縮するにはZIPアーカイブに追加します。圧縮を有効にするには、次のパラメータを使用します。
compress=true
圧縮にはCPUリソースが必要となるため、パフォーマンスに負の影響が及ぶ可能性があります。
デフォルト記録で実行する場合、特定の条件が満たされるたびに現在のインメモリー記録データがファイルに自動保存されるように、Java Flight Recorderを構成できます。ディスク・リポジトリを使用する場合は、ディスク・リポジトリ内の現在の情報も含められます。
JVMが終了するたびに記録データを指定されたパスに保存するには、次のオプションでアプリケーションを起動します。
-XX:FlightRecorderOptions=defaultrecording=true,dumponexit=true,dumponexitpath=path
pathは、記録を保存すべき場所に設定します。ディレクトリを指定した場合、そのディレクトリ内に、日付と時間を名前に持つファイルが作成されます。ファイル名を指定した場合は、その名前が使用されます。パスを指定しなかった場合は、現在のディレクトリに記録が保存されます。
Java Mission Controlのコンソールを使用してトリガーを設定できます。トリガーとは、ルールによって指定される条件が真になるたびにアクションを実行するルールのことです。たとえば、ヒープ・サイズが100 MBを超えるたびにフライト記録が開始されるルールを作成できます。Java Mission Controlのトリガーは、JMX MBean経由で公開されたプロパティをルールへの入力として使用できます。これらは、フライト・レコーダ・ダンプだけでなく、その他のさまざまなアクションを起動できます。
トリガーは、JMXコンソールの「トリガー」タブで定義します。トリガーを作成する方法の詳細は、Java Mission Controlのヘルプを参照してください。
Java Flight Recorderは、診断のみを目的としています。記録ファイルには、Javaコマンド行オプションや環境変数などの機密情報が含まれる可能性があります。記録ファイルの格納や転送を行う際には、診断コア・ファイルやヒープ・ダンプの場合と同様に細心の注意を払ってください。
表2-1では、JFRを使用する様々な方法に対するセキュリティ権限について説明します。
Java Flight Recorderから大量の診断情報を収集するには、次のオプションのいずれかでJVMを起動します。
-XX:FlightRecorderOptions=loglevel=debug
-XX:FlightRecorderOptions=loglevel=trace
.