注意: Java Flight Recorderを本番で使用するには、商用ライセンスが必要です。商用機能の詳細とそれらを有効化する方法については、http://www.oracle.com/technetwork/java/javaseproducts/ にアクセスしてください。 |
Java Flight Recorder (JFR)は、実行中のJavaアプリケーションに関する診断およびプロファイリングのデータを収集するツールです。Java Virtual Machine (JVM)に統合されていて、パフォーマンスのオーバーヘッドがほとんど発生しないため、高負荷の本番環境でも使用できます。デフォルト設定を使用する場合、内部テストと顧客フィードバックの両方から、パフォーマンスへの影響は1%未満であることがわかっています。一部のアプリケーションでは、この値が格段に低くなる可能性があります。ただし、実行時間の短いアプリケーション(本番環境で実行される種類のアプリケーションではない)では、相対的な起動/準備時間が長くなる可能性があり、パフォーマンスへの影響が1%を超える可能性があります。JFRは、JVMおよびそこで実行されているJavaアプリケーションに関するデータを収集します。
その他の類似したツールと比べて、JFRには次のような利点があります。
より適切なデータの提供: JFRにより使用されるコヒーレント・データ・モデルにより、イベントの相互参照やフィルタ処理が簡単になります。
サードパーティのイベント・プロバイダに対応: JFRのAPIセットを使用して、WebLogic Serverおよびその他のOracle製品を含むサードパーティ・アプリケーションをモニターできます。
総所有コストの削減: JFRは、問題の診断とトラブルシューティングにかかる時間を短縮し、運用コストを削減して業務の中断を低減し、問題解決までの時間を短縮して、システム効率を向上させます。
JFRの主な用途は次のとおりです。
プロファイリング
JFRは継続的に、稼働中のシステムに関するデータを大量に保存します。このプロファイリング情報には、スレッド・サンプル(プログラムが時間を費やした箇所を示す)、ロック・プロファイル、およびガベージ・コレクション詳細が含まれます。
ブラック・ボックス分析
JFRは継続的に情報を循環バッファに保存します。異常検出時にこの情報にアクセスすれば、その原因がわかります。
サポートおよびデバッグ
Oracleサポートに連絡する際には、JFRによって収集されたデータが、Javaアプリケーションの問題を診断しやすくするうえで不可欠となる可能性があります。
Java Flight Recorderは、イベントに関するデータを収集します。イベントは特定の時間に、JVMまたはJavaアプリケーション上で発生します。各イベントには、名前、タイム・スタンプおよびオプションのペイロードがあります。ペイロードとは、イベントに関連するデータ(CPU使用率、イベント前後のJavaヒープ・サイズ、ロック保有者のスレッドIDなど)です。
ほとんどのイベントには、イベントの発生元のスレッド、イベント発生時のスタック・トレース、およびイベントの期間に関する情報も含まれます。イベントで使用可能な情報を使用すれば、JVMおよびJavaアプリケーションに関するランタイムの詳細を再構築できます。
JFRは、次の3種類のイベントに関する情報を収集します。
持続イベントは発生に若干時間がかかり、完了時にログに記録されます。指定した期間よりも長く持続するイベントのみが記録されるように、持続イベントにしきい値を設定できます。これは、その他の種類のイベントには設定できません。
インスタント・イベントは瞬時に発生し、すぐにログに記録されます。
サンプル・イベント(リクエスト可能なイベントとも呼ばれる):は一定間隔でログに記録され、システム・アクティビティのサンプルを提供します。サンプリングが発生する頻度を構成できます。
JFRは、実行中のシステムをきわめて高い詳細レベルでモニターします。このため、データが大量に生成されます。オーバーヘッドをできるだけ小さく保つには、記録されるイベントを実際に必要な種類に制限します。ほとんどの場合、非常に短い期間のイベントは重要ではないため、期間が特定の意味のあるしきい値を超過しているイベントに記録を制限します。
JFRは、JVM(内部API経由)およびJavaアプリケーション(JFR API経由)からデータを収集します。このデータは、グローバルなインメモリー・バッファにフラッシュされる小さなスレッドローカル・バッファに格納されます。その後、グローバルなインメモリー・バッファ内のデータはディスクに書き込まれます。ディスク書込み操作はコストが高いので、記録対象として有効にするイベント・データを注意深く選択することで、その操作を最小限に抑えるよう努力すべきです。バイナリ形式の記録ファイルの形式は非常にコンパクトであるため、アプリケーションは効率的に読取りと書込みが可能です。
様々なバッファ間で情報が重複することはありません。個々のチャンクのデータは、メモリー内とディスク上でどちらかで使用可能ですが、両方の場所で使用することはできません。これは、次のことを示します。
ディスク・バッファにフラッシュされていないデータは、電源障害時には使用できません。
JVMがクラッシュしても、一部のデータはコア・ファイル(つまり、インメモリー・バッファ)内で使用でき、一部のデータはディスク・バッファ内で使用できます。JFRでは、このようなバッファをマージする機能は提供されていません。
JFRによって収集されたデータが使用可能になるまでに、短時間の遅延が発生する可能性があります(たとえば、表示可能になる前に、別のバッファに移動する必要がある場合)。
データが複数のスレッド・バッファからチャンク単位で収集されると、記録ファイル内のデータの順序が時系列にならない場合があります。
JVMがクラッシュしないようにするために、イベントの順序が下げられる場合もあります。ディスクに十分な速さで書き込むことができないデータは、すべて破棄されます。これが発生すると、どの期間に影響が及んだかについての情報が記録ファイルに追加されます。この情報のログは、JVMのロギング機能にも記録されます。
どのデータもディスクに書き込まれないようにJFRを構成できます。このモードでは、グローバル・バッファは循環バッファとして機能し、バッファがいっぱいになった時点でもっとも古いデータが破棄されます。この非常にオーバーヘッドの低い操作モードでも、問題の根本原因分析に必要となる重要なデータはすべて収集されます。グローバル・バッファでは最新のデータが常に使用可能となっているため、操作や監視システムによって問題が検出されるたびに、オン・デマンドでそれをディスクに書き込むことができます。ただし、このモードで使用可能なのは最後の数分間のデータだけなので、それには最新のイベントしか含まれていません。長期にわたる操作の全履歴を取得する必要がある場合には、イベントが定期的にディスクに書き込まれるデフォルト・モードを使用してください。
JFRは、次のコンポーネントで構成されています。
JFRランタイムは、記録を生成するJVM内部の記録エンジンです。ランタイム・エンジン自体は、次のコンポーネントで構成されています。
エージェントは、バッファ、ディスクI/O、MBeanなどを制御します。このコンポーネントでは、CおよびJavaコードで作成された動的ライブラリが提供され、JVMに依存しない純粋なJava実装も提供されます。
プロデューサはデータをバッファに挿入します。JVMとJavaアプリケーションから、および(Java API経由で)サード・パーティ製のアプリケーションからイベントを収集できます。
Java Mission Control (JMC)のフライト・レコーダ・プラグインにより、グラフィカル・ユーザー・インタフェース(GUI)を使用してJMCクライアントからJFRを操作し、記録の開始、停止および構成に加え、記録ファイルの表示を行うことができます。
デフォルトでは、JFRがJVMで無効になっています。JFRを有効にするには、-XX:+FlightRecorder
オプションを付けてJavaアプリケーションを起動する必要があります。JFRはJava Platform, Standard Edition (Oracle Java SE AdvancedおよびOracle Java SE Suite)に基づく市販パッケージ内でのみ使用可能な市販の機能であるため、-XX:+UnlockCommercialFeatures
オプションを使用して市販機能を有効にする必要もあります。
たとえば、MyApp
という名前のJavaアプリケーションの起動時にJFRを有効にするには、次のコマンドを使用します。
java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder MyApp