JDK Flight Recorder(JFR)は、広範なシステムレベルのイベントを記録する構造化ロギングツールです。インシデント調査で使用するためにフライトデータを継続的に記録する航空機のブラックボックスと同様に、JFRは問題診断のためにJVM内のイベントストリームを継続的に記録します。このアプローチの利点は、インシデントに至るまでのシステムに関する時系列の詳細情報をキャプチャできる点にあります。JFRはパフォーマンスへの影響を最小限に抑えるように設計されており、本番環境で長期間にわたって安全に実行できます。
Java 17以降、JFRはJProfilerのデータソースの1つにもなっています。JVMのプロファイリングインターフェースを使用するネイティブエージェントに加えて、プロファイリングのコンテキストにおいて関心の高い高レベルシステムがJVM内には存在します。1つはJProfilerの一部のテレメトリーにデータを提供するMBeanシステムであり、もう1つはガベージコレクタプローブに使用されるJFRです。この目的において、ユーザーがJFRを直接操作する必要はなく、JProfilerが透過的にJFRイベントストリーミングを処理します。
JProfilerにおけるJFRの統合
JProfilerはJFR記録を完全に統合しているため、ローカルマシンやJFR記録が設定されていなかったリモートマシン上で実行されているJVMからデータを簡単にキャプチャできます。
JProfiler UIでJFRスナップショットを開くと、利用可能なビューやセクションは通常のプロファイリングセッションとは異なります。UIの中心となるのはイベントブラウザです。JFRビューで利用可能なその他のすべてのビューについては、別の章で説明されています。
フィルターの設定や分析結果の確認を行いながらイベントタイプを操作していると、JProfilerはJFRスナップショットファイルを再スキャンしなければならない場合があります。JFRスナップショットファイルは非常に巨大になる可能性があり、すべてのデータをメモリ内に保持したり、すべての分析を事前に計算したりすることは現実的ではありません。このため、ネットワークドライブからJFRスナップショットを開くことは推奨されません。
非常に大容量のJFRスナップショットを開く場合は、ファイルチューザーで[分析のカスタマイズ]チェックボックスをクリックし、分析に不要なイベントカテゴリを除外することで、スナップショットの処理速度を向上させ、メモリ使用量を削減できます。利用可能なイベントカテゴリは、個別のプローブやビューセクションをカバーしています。CPUビュー、メモリビュー、テレメトリービュー用のイベントタイプは必須であり、除外することはできません。
たとえば、CPUデータのみに関心がある場合は、すべてのプローブとイベントブラウザを除外できます。JProfilerは最速のJFRビューアを目指しており、一般的なJFRスナップショットを迅速に開きますが、JFR記録は際限なく大きくなる可能性があり、開く速度が問題となるような数十ギガバイトものサイズのスナップショットを扱うことになる場合もあります。
JFRスナップショット内のスタックトレース
JFRの重要な機能の1つは、特定のイベントタイプのスタックトレース全体を効率的にログ記録できることです。このようなイベントタイプについては、JFR設定でスタックトレースの記録を切り替えることができます。多くのJVMアプリケーションイベントタイプ、特にスレッドに関係するイベントタイプでは、デフォルトでスタックトレースの記録が有効になっています。
JFRは固定の深さまでしかスタックトレースを収集しないため、長いスタックトレースは切り捨てられます。切り捨てられたトレースは分かりやすい呼び出しツリーを構築するのには適さないため、これらのトレースは特別にマークされたノードの下に表示されます。次の
-XX:FlightRecorderOptions=stackdepth=<nnnn>
VMパラメータを使用すると、JFRで収集されるトレースのサイズを増やし、アプリケーションでトレースが切り捨てられるのを防ぐことができます。