JFRイベントブラウザ以外にも、JProfilerはフルプロファイリングセッションで利用可能なビューの一部をJFRデータで表示します。これは、JFRがメモリ割り当てやメソッド実行のデータを収集するため可能となっています。主な制限は記録レートが低いことであり、問題となるホットスポットを特定するのに十分なデータを得るには時間がかかる場合があります。
テレメトリー
「Recorded objects telemetry」を除き、フルプロファイリングセッションのすべてのテレメトリーは、表示データにいくつかの制限があるものの、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種類のイベントタイプを使ってビューにデータを表示します。「Live
objects」ビューは、フルGC後にヒープ上に残るすべてのクラスとインスタンス数の統計的な表現を表示します。このデータは、jdk.ObjectCountイベントが有効な場合のみ利用できますが、これはデフォルトのJFRテンプレートでは有効になっていません。なぜなら、かなりのオーバーヘッドが発生するためです。この設定は、JFRのハイレベル設定で「Garbage
collector」ドロップダウンから切り替えることができます。Java 17以前では、このドロップダウンは「Memory profiling」と表示されます。
jdk.ObjectCountイベントがスナップショット内で複数回記録されている場合、ビューには最初と最後の発生の差分が表示されます。これにより、記録期間中に数値がどのように変化したかを把握でき、メモリリークの兆候を示す場合があります。これらのタイミングがスナップショット記録の開始・終了と一致しない場合、対応するブックマークがテレメトリービューに追加されます。合計オブジェクトサイズが一定の閾値(通常はヒープの1%)を超えるクラスのみが含まれます。
本格的な調査が必要な場合は、フルプロファイリングセッションの利用や、HPROFスナップショットの取得を検討してください。
「Recorded objects」ビューおよび割り当てビューでは、Java
16以降はjdk.ObjectAllocationSampleイベント、より古いJavaバージョンではjdk.ObjectAllocationInNewTLABおよびjdk.ObjectAllocationOutsideTLABイベントのデータを表示します。ハイレベルUIの「Allocation
Profiling」ドロップダウンからもこれらのイベントタイプを有効化できます。
「Live objects」ビューとは異なり、これらのビューは記録中に割り当てられたオブジェクトのみを表示します。割り当てはJFRによってサンプリングされますが、サイズは割り当て済み合計サイズの推定値として報告されます。このため、これらのビューで表示されるサイズは、サンプル数と平均インスタンスサイズの積とは一致しません。それ以外は、フルプロファイリングセッションのメモリビューと同様の機能を持ちます。
CPUビュー
「CPUビュー」には呼び出しツリー、ホットスポットビュー、呼び出しグラフが含まれます。「Runnable」スレッド状態のデータは、標準のJFRテンプレートでデフォルトで記録されるjdk.ExecutionSampleイベントに基づいています。ただし、サンプリングレートはデフォルトで20msに設定されており、これはJFRハイレベルUIの「Method
sampling」設定の「Normal」オプションに相当します。JFRはごく少数のランダムなスレッドしかサンプリングしないため、ホットスポットが十分に目立つようなデータを得るには非常に時間がかかる場合があります。必要に応じてjdk.ExecutionSampleの期間を短くすることを検討してください。ただし、JFRはデータを集約しないため、スナップショットサイズが非常に大きくなる可能性があります。
スレッドが断続的にサンプリングされるため、フルプロファイリングセッションのように実際の実行時間を推定することはできません。時間の代わりに、呼び出しツリーやホットスポットビューではイベント数が表示されます。これは非同期サンプリングと同様で、同じ欠点があります。他のJFRスレッド状態は「Waiting」「Blocking」「Socket and file I/O」であり、これらは引き続き時間を計測します。この違いにより、スレッド状態セレクターで「All thread states」モードは利用できません。
さらに、ノンランナブルなスレッド状態は、ツールチップでスレッド状態セレクターの横に表示される設定可能な最小継続時間の閾値を持つイベントから計算されます。これらのスレッド状態の実際の合計時間は、表示よりも大幅に長い場合があります。スレッド状態の組み立てに使用されるイベントタイプの表は以下の通りです。
| スレッド状態 | イベントタイプ |
|---|---|
| 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の両方で利用でき、同じビューで表示されます。この場合、イベントブラウザはスレッドダンプカラムの構造化された内容を表示できないため、代替にはなりません。スレッドダンプビューでは、異なるスレッドダンプの比較も可能です。
プローブ
フルプロファイリングセッションの一部のJVMプローブには、JFRスナップショットで同等のデータソースがあります。イベントブラウザと比較した場合の主な利点は、複数の関連イベントタイプを組み合わせている点です。下記の表は、利用可能なプローブと、それぞれのデータソースとなるイベントタイプを示しています。
| プローブ | イベントタイプ | プロファイルで有効 |
|---|---|---|
| Sockets | jdk.SocketRead, jdk.SocketWrite | すべて |
| Files | jdk.FileRead, jdk.FileWrite | すべて |
| クラス | jdk.ClassLoad, jdk.ClassUnload, jdk.ClassDefine | なし |
| 例外 | jdk.JavaErrorThrow, jdk.JavaExceptionThrow | 両方でエラー、例外はなし |
| Garbage Collector | 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ストリーミングが使用されます。詳細はガーベジコレクター解析の章を参照してください。















