JProfiler ヘルプ

JFRスナップショットのビュー

JDK Flight Recorder (JFR)

JProfilerは、JFRイベントブラウザだけでなく、完全なプロファイリングセッションで利用可能ないくつかのビューを使用し、それらにJFRデータを入力します。これは、JFRがメモリ割り当てとメソッド実行のデータを収集するために可能となっています。主な制限事項としては、記録レートが低いため、問題のあるホットスポットを確認するのに十分なデータを取得するまでに長い時間がかかる可能性があることです。

テレメトリー

「記録済みオブジェクトテレメトリー」を除き、完全なプロファイリングセッションのすべてのテレメトリーは、表示されるデータにいくつかの制限はあるものの、JFRスナップショットでも利用できます。メモリテレメトリーにはGC固有のプールが表示されず、スレッドテレメトリーにはスレッド状態別のスレッド数が表示されず、記録されたスループットテレメトリーにはオブジェクト数ではなくサイズが表示され、解放中のオブジェクトは表示されません。

以下の表は、各テレメトリーで使用されるイベントタイプと、それらが「default」テンプレートと「profile」テンプレートの両方で有効になっているかどうかを示しています。

テレメトリー イベントタイプ プロファイルで有効
メモリ jdk.GCHeapSummary, jdk.MetaspaceSummary すべて
記録されたスループット jdk.ObjectAllocationSample, jdk.ObjectAllocationInNewTLAB, jdk.ObjectAllocationOutsideTLAB プロファイルのみ
GCアクティビティ jdk.GarbageCollection すべて
クラス jdk.ClassLoadingStatistics すべて
スレッド jdk.JavaThreadStatistics すべて
CPU負荷 jdk.CPULoad すべて

メモリビュー

「メモリ」セクションでは、ビューにデータを設定するために2つの異なるイベントタイプが使用されます。「生存オブジェクト」ビューには、フルガベージコレクション後にヒープ上に残っているすべてのクラスとインスタンス数の統計的表現が表示されます。このデータはjdk.ObjectCountイベントが有効になっている場合にのみ利用可能ですが、大きなオーバーヘッドを伴うため、デフォルトのJFRテンプレートのどちらでも有効になっていません。この設定は、高レベルJFR構成の「Garbage collector」ドロップダウンで切り替えることもできます。Java 17より前では、このドロップダウンは「Memory profiling」とラベル付けされています。

スナップショット内にjdk.ObjectCountイベントが複数回記録されている場合、ビューにはjdk.ObjectCountイベントの最初と最後の発生箇所の差分が表示されます。これにより、記録時間中に数値がどのように変化したかを把握でき、メモリリークの兆候を掴むことができます。これらの時間がスナップショット記録の開始点および終了点と一致しない場合、テレメトリービューに対応するブックマークが追加されます。合計オブジェクトサイズが固定のしきい値(通常はヒープの1%)を超えるクラスのみが含まれます。

本格的な調査を行う場合は、完全なプロファイリングセッションを使用するか、HPROFスナップショットを取得することを検討してください。

「記録済みオブジェクト」ビューおよび割り当てビューには、Java 16以降のjdk.ObjectAllocationSampleイベント、およびそれ以前のJavaバージョンのjdk.ObjectAllocationInNewTLABイベントとjdk.ObjectAllocationOutsideTLABイベントからのデータが表示されます。高レベルUIの「Allocation Profiling」ドロップダウンでも、これらのイベントタイプを有効にする方法が提供されています。

「生存オブジェクト」ビューとは異なり、これらは記録がアクティブな間に割り当てられたオブジェクトのみを表示します。割り当てはJFRによってサンプリングされますが、サイズは割り当て済み合計サイズの推定値として報告されます。この差異があるため、これらのビューによって報告されるサイズは、サンプル数に平均インスタンスサイズを掛けた値とは一致しません。それ以外については、これらのビューは完全なプロファイリングセッションのメモリビューと同様の機能を備えています。

CPUビュー

「CPUビュー」には、呼び出しツリー、ホットスポットビュー、および呼び出しグラフが含まれます。「Runnable」スレッド状態のデータは、両方の標準JFRテンプレートでデフォルトで記録されるjdk.ExecutionSampleイベントに基づいています。ただし、サンプリングレートはデフォルトで20ミリ秒に設定されており、これはJFR高レベルUIの「Method sampling」設定の「Normal」オプションに対応します。JFRがサンプリングするのはごく少数のランダムなスレッドのみであることを考慮すると、ホットスポットが十分に目立つだけの十分なデータを取得するには非常に長い時間がかかる場合があります。必要に応じて、jdk.ExecutionSampleの周期を短くすることを検討してください。ただし、JFRはデータを累積しないため、スナップショットのサイズが非常に大きくなる可能性があることに注意してください。

スレッドは散発的にサンプリングされるため、完全なプロファイリングセッションのように実際の実行時間を推定することはできません。呼び出しツリーおよびホットスポットビューには、時間の代わりにイベント数が表示されます。これは同様の欠点を持つ非同期サンプリングと似ています。その他のJFRスレッド状態は「Waiting」、「Blocking」、および「Socket and file I/O」であり、これらは引き続き時間を測定します。この差異のため、スレッドステータスセレクターでは「All thread states」モードを利用できません。

もう1つの考慮事項として、実行可能(non-runnable)以外のスレッド状態は、スレッドステータスセレクターの横にあるツールチップに表示される設定可能な最小期間のしきい値を持つイベントから計算されるという点があります。これらのスレッド状態の実際の合計時間は、大幅に長くなる可能性があります。スレッド状態の組み立てに使用されるイベントタイプの表を以下に示します:

スレッド状態 イベントタイプ
Runnable jdk.ExecutionSample
Waiting jdk.JavaMonitorWait, jdk.ThreadSleep, jdk.ThreadPark
Blocking jdk.JavaMonitorEnter
Socket and file I/O jdk.SocketRead, jdk.SocketWrite, jdk.FileRead, jdk.FileWrite

各ビューの機能については、CPUビューに関するヘルプトピックで説明されています。完全なプロファイリングセッションの多くの機能は、JFRのコンテキストでは利用できないことに注意してください。

スレッドおよびmonitorビュー

時系列のメソッドサンプリングデータから、待機時間やブロック時間のスタックトレースを表示するツールチップを含め、スレッド履歴ビューを計算できます。

スレッドダンプはJFRとJProfilerの両方の機能であり、同じビューに表示されます。この場合、イベントブラウザにはjdk.ThreadDumpイベントのスレッドダンプ列の構造化されたコンテンツを表示する方法がないため、代用にはなりません。スレッドダンプビューでは、異なるスレッドダンプを比較することもできます。

プローブ

完全なプロファイリングセッションにおけるJVMプローブの一部には、JFRスナップショットに対応するデータソースがあります。イベントブラウザと比較した場合の主な利点は、複数の関連するイベントタイプを結合できることです。以下の表は、利用可能なプローブと、そのデータソースとして使用されるイベントタイプを示しています。

プローブ イベントタイプ プロファイルで有効
Socket jdk.SocketRead, jdk.SocketWrite すべて
ファイル jdk.FileRead, jdk.FileWrite すべて
クラス jdk.ClassLoad, jdk.ClassUnload, jdk.ClassDefine なし
例外 jdk.JavaErrorThrow, jdk.JavaExceptionThrow 両方でエラー、いずれも例外なし
ガベージコレクタ jdk.GarbageCollection, jdk.GCPhasePause, jdk.YoungGarbageCollection, jdk.OldGarbageCollection, jdk.GCReferenceStatistics, jdk.GCPhasePauseLevel<n>, jdk.GCHeapSummary, jdk.MetaspaceSummary, jdk.GCHeapConfiguration, jdk.GCConfiguration, jdk.YoungGenerationConfiguration, jdk.GCSurvivorConfiguration, jdk.GCTLABConfiguration すべて

クラスのロードには高レベルJFR UIに個別のチェックボックスがあり、3つのクラスロードイベントすべてをオンにします。

各プローブには複数のビューが表示されます。イベントブラウザとは対照的に、個々のイベントではなく集約されたデータに焦点が当てられます。これは、JProfilerのプローブが概念的にJFRデータ収集と異なる点でもあります。

ガベージコレクタプローブを除き、すべてのプローブには次のビューがあります: 呼び出しツリービューおよびホットスポットビューでは、単一のスレッドまたはスレッドグループと、集約レベルを選択できます。デフォルトではすべてのスレッドが表示され、集約レベルは「メソッド」に設定されています。

テレメトリービューには、記録されたデータからの1つ以上のテレメトリーが表示され、すべてを一度に表示する概要ページがあります。完全なテレメトリーは、テレメトリー名をクリックして開くことができます。時間軸に沿ってドラッグすることで、イベントビュー内の対応するイベントを選択できます。

イベントビューは、JFRブラウザのイベントビューと似ています。ただし、基礎となるJFRイベントに対応する複数のイベントタイプが表示され、タイプセレクターが提供されます。単一選択および複数選択に対するフィルタリングとスタックトレース表示は、イベントブラウザとまったく同様に処理されます。また、時間とメモリの測定用ヒストグラムビューもあり、水平軸に沿ってドラッグして範囲を選択できます。

ガベージコレクタビューは特別で、完全なプロファイリングセッションにおいてJava 17以降のプロファイリングセッションでまったく同じ情報を表示できるためです。JVMプローブカテゴリのガベージコレクタプローブが記録されると、必要なデータを取得するためにJFRストリーミングが使用されます。詳細については、ガベージコレクタ分析に関する章を参照してください。