プロファイリングインターフェースを有効にする必要がなく、最小限のオーバーヘッドで本番環境のJVMでJFRを実行できる利点があるため、JProfilerはUIから直接JFRの記録をサポートしています。
プログラムから、またはコマンドラインで-XX:StartFlightRecording
VMパラメータを追加してJFRを開始することもできますが、JProfilerを使用すれば、すでに実行中のJVMに対して記録の開始および停止を簡単に行うことができます。
JProfilerを使用してJVMにattachする際、ネイティブのプロファイリングエージェントをロードする代わりに、JFR記録の開始と停止を選択できます。JProfilerの充実したリモート接続機能により、例えばコンテナを変更することなく、DockerやKubernetesコンテナで実行されているJVMでJFR記録を開始できます。
JFR記録の開始と停止
スタートセンターの「クイックアタッチ」タブでJVMを選択し、ダイアログの下部にあるStart JFRボタンをクリックします。スクリーンショットにはローカルで実行中のJVMが表示されていますが、リモートJVMにattachする場合でも同じボタンを使用できます。
次に、JFR設定ウィザードで、選択したプロセスが使用しているJREのlib/jfrディレクトリから送信されたイベント設定テンプレートのいずれかを選択できます。デフォルトでは「default」と「profile」という2つのテンプレートがあり、「profile」はより多くのデータを記録し、オーバーヘッドも大きくなります。そのディレクトリに他のファイルを作成すると、ウィザードで対応するテンプレートを選択できるようになります。
これらのテンプレートファイルには、利用可能なイベントと、重要な高レベル設定の設定ディレクティブが含まれています。各高レベル設定は、複数の異なるイベントに関連付けることができます。このUIは、テンプレートファイルの内容に基づいて動的に生成されます。異なるプロファイルを切り替えると、異なるデフォルト値が表示されます。このUIには含まれておらず、次のステップでのみ設定可能なイベントタイプも多数存在します。
同じイベントタイプのセットを持つJVMに対してすでにJFR記録を開始したことがある場合、JProfilerは前回の設定を使用するオプションを提示します。
そのオプションを選択した場合、高レベルの記録設定は利用できず、次のステップに進んで設定全体を確認し、さらに変更を加えることができます。
ウィザードのこのステップにおけるもう1つの重要な設定は、最大スナップショットサイズです。JFR記録の性質上、スナップショットのサイズは非常に急速に増大し、ハードディスク全体を一杯にしてしまう可能性があります。それを防ぐため、最大スナップショットサイズの制約により過度なストレージ消費を防止します。最大サイズに達すると、古いイベントは破棄され、新しいイベントが継続して記録されます。このプロセスはJFRの自動メカニズムです。
ウィザードの次のステップでは、すべてのイベントタイプの分類ツリーが表示され、右側で各イベントの詳細設定を行うことができます。
イベントには、周期(period)、しきい値(threshold)、および各イベントのスタックトレースを記録するかどうかのフラグの設定が存在する場合があります。周期としきい値はどちらも時間単位を持つ設定であり、downキーを押すと利用可能な単位のオートコンプリートポップアップが表示されます。また周期では、「everyChunk」、「beginChunk」、「endChunk」という特別な値もサポートされており、これらもオートコンプリートポップアップから利用できます。「チャンク」とは、連続した一連のイベントデータとメタデータを保持し、記録におけるストレージおよびデータ転送の基本単位として機能するJFR記録の一部を指します。
ツリーで選択されるイベントが多いほど、より多くのデータが記録されます。一部のイベントタイプは膨大な量のデータを生成しますが、わずかなイベントしか生成しないものもあります。
UIにデータがすぐに表示されるフルプロファイリングモードや「Heap dump only」モードとは異なり、JFRスナップショットを開始しても、JProfilerが記録を開始したことがわかるように、選択されていないテーブル内のJVMの背景色が変更されるだけです。JVMが選択されている場合、下部にあるJFRボタンのテキストが記録停止を示す内容に変わります。
JProfilerによって開始されたJFR記録を停止すると、JFRスナップショットが転送され、JProfilerで開かれます。このスナップショットは一時的なものであり、ウィンドウを閉じると削除されます。スナップショットを永続的な場所に保存するには、ツールバーの「Save snapshot」アクションを使用してください。
JFR記録中に終了したJVM
JFRの用途として挙げられるものの1つに、クラッシュ直前の状況の調査があります。その場合、JFR記録を停止してJFRスナップショットを開くためのJVMがJVMテーブルに存在しなくなります。JProfilerでJFR記録が開始され、記録を停止する前にJVMが終了した場合、「Terminated JFR:」というプレフィックスが付いた特殊なエントリがJVMテーブルに追加されます。そのエントリをダブルクリックするか、「Open Snapshot」ボタンを使用することで、JFRスナップショットを開くことができます。
このようなエントリは、一度開くとリストから削除されます。手動で停止した記録と同様に、開かれたJFRスナップショットは一時的なものであるため、後で分析するために保持したい場合は保存する必要があります。
外部で開始されたJFR記録の表示
上記の例では、JFR記録はJProfiler内で開始および停止されました。JProfilerの外部で開始されたJFR記録を表示することも可能です。継続的なJFR記録は、以下のようなVMパラメータを使用して簡単に開始できます。
"-XX:StartFlightRecording=maxsize=500m,filename=$TEMP/myapp.jfr,name=Continuous recording"
JFR記録が実行中であることを示すJVMテーブル内の特殊な背景色による表示は、JProfilerで開始されたJFR記録にのみ適用されます。他の方法でJFR記録が開始されたJVMに接続すると、別のダイアログが表示されます。
ここで、JProfilerで新しい記録を開始するか、既存の記録をダンプして結果のJFRスナップショットをJProfilerに表示するかを選択できます。外部で開始されたJFR記録には個別のライフサイクルがあり、JProfilerによって停止されることはありません。













