この章では、デフォルト記録と明示的記録の両方について Java Flight Recorder をコマンド行から起動する方法を説明します。
この章には次のセクションがあります。
Java Flight Recorder では多数の記録を同時に実行できます。各記録を異なる設定を使って構成できます。特に、記録ごとに異なるイベントセットが捕捉されるように構成できます。ただし、Java Flight Recorder の内部ロジックをできるだけ簡素化するために、結果の記録には常に、その時点でアクティブになっていたすべての記録のすべてのイベントの和集合が含まれます。これは、複数の記録が実行中の場合、必要だった情報より多くなる可能性があることを意味しています。これが若干の混乱をまねく場合がありますが、それ以外の負の影響はありません。
Java Flight Recorder を使用すれば、明示的記録を作成できます。つまり、明示的に記録を開始して、所定の期間実行したり手動で停止するまで実行したりできます。このセクションではこれを行う方法について説明します。
記録の開始に使用する方法にかかわらず、同じパラメータセットを使用できます。明示的記録の制御は、次のどのツールを使っても行えます。
Java Flight Recorder を制御するもっとも単純な方法は、Java Mission Control クライアントを使用する方法です。詳細については、セクション 2.1「Java Mission Control クライアントの使用」を参照してください。
コマンド行から記録を開始したり構成したりするには、アプリケーションの起動時に java
コマンドの -XX:StartFlightRecording
オプションを使用します。Java Flight Recorder の使用を有効化するには、-XX:+FlightRecorder
オプションを指定します。Java Flight Recorder は商用の機能なので、-XX:+UnlockCommercialFeatures
オプションも指定する必要があります。次の例は、MyApp
アプリケーションを実行し、すぐに 60 秒間の記録を開始し、それを myrecording.jfr
という名前のファイルに保存する方法を示しています。
java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:StartFlightRecording=duration=60s,filename=myrecording.jfr MyApp
Java Flight Recorder を構成するには、-XX:FlightRecorderOptions
オプションを使用できます。詳細については、セクション A.1「コマンド行オプション」を参照してください。
Java 固有の診断コマンドを使って記録を制御することもできます。診断コマンドの詳細については、セクション A.2「診断コマンドリファレンス」を参照してください。
診断コマンドを実行するもっとも単純な方法は、(Java インストールディレクトリにある) jcmd
ツールを使用することです。コマンドを発行するには、JVM のプロセス ID (またはメインクラスの名前) と実際のコマンドを、jcmd
の引数として渡す必要があります。たとえば、ID 5368 の実行中 Java プロセスで 60 秒間の記録を開始し、それを現在のディレクトリの myrecording.jfr
に保存するには、次を使用します。
jcmd 5368 JFR.start duration=60s filename=myrecording.jfr
実行中のすべての Java プロセスの一覧を表示するには、引数なしで jcmd
コマンドを実行します。実行中 Java アプリケーションで使用可能なコマンドの完全な一覧を表示するには、プロセス ID (またはメインクラスの名前) のあとに診断コマンドとして 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 経由で公開されたプロパティーをルールへの入力として使用できます。これらは、フライトレコーダーダンプだけでなく、その他のさまざまなアクションを起動できます。
トリガーは、JRockit Mission Control コンソールの「MBean」ページの「トリガー」タブで定義します。トリガーを作成する方法の詳細については、Java Mission Control のオンラインヘルプを参照してください。