JFRスナップショットのビュー
JFRイベントブラウザとは別に、JProfilerはフルプロファイリングセッションで利用可能なビューの一部を使用し、それらをJFRデータで埋めます。これは、JFRがメモリ割り当てとメソッド実行のデータを収集するため可能です。主な制限は記録レートが低いことで、問題のあるホットスポットを確認するために十分なデータを得るのに時間がかかることです。
テレメトリー
「記録されたオブジェクトのテレメトリー」を除いて、フルプロファイリングセッションのすべてのテレメトリーは、表示されるデータにいくつかの制限があるものの、JFRスナップショットでも利用可能です。メモリテレメトリーはGC特有のプールを表示せず、スレッドテレメトリーはスレッド状態ごとのスレッド数を表示せず、記録されたスループットテレメトリーはオブジェクト数ではなくサイズを表示し、解放されるオブジェクトを表示しません。
以下の表は、さまざまなテレメトリーで使用されるイベントタイプと、それらが「デフォルト」および「プロファイル」テンプレートの両方で有効になっているかどうかを示しています。
テレメトリー | イベントタイプ | プロファイルで有効 |
---|---|---|
メモリ | 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の高レベル設定で「ガベージコレクタ」ドロップダウンを使用して切り替えることもできます。Java
17以前では、このドロップダウンは「メモリプロファイリング」とラベル付けされています。
jdk.ObjectCount
イベントがスナップショットで複数回記録されている場合、ビューはjdk.ObjectCount
イベントの最初と最後の発生の違いを表示します。このようにして、記録時間中に数値がどのように変化したかを把握し、メモリリークの兆候を提供する可能性があります。これらの時間がスナップショット記録の開始点と終了点と一致しない場合、対応するブックマークがテレメトリービューに追加されます。通常、ヒープの1%以上の合計オブジェクトサイズを持つクラスのみが含まれます。
重大な調査には、フルプロファイリングセッションを使用するか、HPROFスナップショットを取得することを検討してください。
「記録されたオブジェクト」ビューおよび割り当てビューは、Java
16以降のjdk.ObjectAllocationSample
イベントと、以前のJavaバージョンのjdk.ObjectAllocationInNewTLAB
およびjdk.ObjectAllocationOutsideTLAB
イベントからデータを表示します。高レベルUIの「割り当てプロファイリング」ドロップダウンでもこれらのイベントタイプを有効にする方法が提供されています。
「ライブオブジェクト」ビューとは異なり、これらは記録がアクティブな間に割り当てられたオブジェクトのみを表示します。割り当てはJFRによってサンプリングされますが、サイズは割り当てられた総サイズの推定値として報告されます。この不一致のため、これらのビューで報告されるサイズは、サンプル数に平均インスタンスサイズを掛けたものと一致しません。それ以外の場合、これらのビューは、フルプロファイリングセッションのメモリビューと同様の機能を持っています。
CPUビュー
「CPUビュー」には、呼び出しツリー、ホットスポットビュー、および呼び出しグラフが含まれます。「Runnable」スレッド状態のデータは、標準のJFRテンプレートの両方でデフォルトで記録されるjdk.ExecutionSample
イベントに基づいています。ただし、サンプリングレートはデフォルトで20
msに設定されており、これはJFRの高レベルUIの「メソッドサンプリング」設定の「ノーマル」オプションに対応しています。JFRは非常に少数のランダムなスレッドのみをサンプリングするため、ホットスポットが十分に目立つように十分なデータを取得するには非常に長い時間がかかる可能性があります。必要に応じて、jdk.ExecutionSample
の期間を短縮することを検討してください。これにより、JFRがデータを累積しないため、非常に大きなスナップショットサイズになる可能性があることに注意してください。
スレッドが断続的にサンプリングされるため、フルプロファイリングセッションのように実際の実行時間を推定することはできません。時間の代わりに、呼び出しツリーとホットスポットビューにはイベント数が表示されます。これは、同じ欠点を持つ非同期サンプリングと似ています。他のJFRスレッド状態は「Waiting」、「Blocking」、「Socket and file I/O」であり、依然として時間を測定します。この不一致のため、スレッド状態セレクタで「すべてのスレッド状態」モードは利用できません。
もう一つの考慮事項は、非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コンテキストでは利用できないことに注意してください。
スレッドとモニタービュー
時系列のメソッドサンプリングデータから、スレッド履歴ビューを計算でき、待機時間とブロック時間のスタックトレースを表示するツールチップも含まれます。
スレッドダンプは、JFRとJProfilerの両方で利用可能な機能であり、同じビューに表示されます。この場合、イベントブラウザは、jdk.ThreadDump
イベントのスレッドダンプ列の構造化された内容を表示する方法がないため、代替手段にはなりません。スレッドダンプビューでは、異なるスレッドダンプを比較することもできます。
jdk.JavaMonitorWait
、jdk.ThreadSleep
、jdk.ThreadPark
イベントから、JProfilerは、フルプロファイリングセッションのものと似たモニター履歴を計算しますが、ブロッキングスレッドの情報は含まれていません。問題を解決するためにその情報が必要な場合は、フルプロファイリングセッションに切り替えてください。これにより、フルプロファイリングセッションのロッキンググラフはJFRスナップショットでは利用できないことも意味します。待機イベントに関する集計情報を示すモニター使用統計は存在し、待機時間のみを表示します。
プローブ
フルプロファイリングセッションの一部のJVMプローブには、JFRスナップショットで同等のデータソースがあります。それらの主な利点は、イベントブラウザと比較して、複数の関連するイベントタイプを組み合わせることです。以下の表は、データソースとして使用されるイベントタイプを持つ利用可能なプローブを示しています。
プローブ | イベントタイプ | プロファイルで有効 |
---|---|---|
ソケット | 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ストリーミングが使用されます。詳細については、ガベージコレクタ分析の章を参照してください。