これまでは、JProfiler GUIがプロファイルされたJVM内で動作しているプロファイリングエージェントからデータを取得するライブセッションのみを見てきました。JProfilerはスナップショットもサポートしており、すべてのプロファイリングデータをファイルに書き込むことができます。これはいくつかのシナリオで有利です:
- 例えばテストの一部として自動的にプロファイリングデータを記録する場合、JProfiler GUIで接続することができません。
- 異なるプロファイリングセッションのプロファイリングデータを比較したり、古い記録を参照したりしたい場合。
- プロファイリングデータを他の人と共有したい場合。
スナップショットにはヒープスナップショットを含むすべての記録のデータが含まれます。ディスク容量を節約するため、スナップショットは圧縮されますが、ヒープウォーカーのデータは直接メモリマッピングを可能にするために非圧縮のままにする必要があります。
JProfiler GUIでのスナップショットの保存と開く
ライブセッションをプロファイリングしているとき、Save Snapshotツールバーボタンでスナップショットを作成できます。 JProfilerはリモートエージェントからすべてのプロファイリングデータを取得し、拡張子".jps"のローカルファイルに保存します。 ライブセッションの過程で複数のスナップショットを保存できます。それらは自動的には開かれず、プロファイリングを続けることができます。
保存されたスナップショットは自動的にFile→Recent Snapshotsメニューに追加されるため、 保存したばかりのスナップショットを簡単に開くことができます。ライブセッションがまだ実行中にスナップショットを開く場合、 ライブセッションを終了するか、別のJProfilerウィンドウを開くかを選択できます。
JProfilerのスナップショット比較機能を使用すると、現在のライブセッションで保存したすべてのスナップショットのリストが表示されます。これにより、異なるユースケースを簡単に比較できます。
一般的に、メインメニューからSession→Open Snapshotを呼び出すか、ファイルマネージャーでスナップショットファイルをダブルクリックすることでスナップショットを開くことができます。JProfilerのIDE統合は、IDE自体の汎用的なOpen Fileアクションを通じてJProfilerスナップショットを開くこともサポートしています。 その場合、組み込みのソースコードビューアの代わりにIDEへのソースコードナビゲーションが利用できます。
スナップショットを開くと、すべての記録アクションが無効になり、記録されたデータを持つビューのみが利用可能になります。どのような種類のデータが記録されているかを確認するには、ステータスバーの記録ラベルの上にマウスをホバーしてください。
短命なプログラムのプロファイリング
ライブセッションでは、すべてのプロファイリングデータはプロファイルされたJVMのプロセス内に存在します。そのため、プロファイルされたJVMが終了すると、JProfilerのプロファイリングセッションも閉じられます。JVMが終了した後もプロファイリングを続けるには、セッション起動ダイアログで有効にできる2つのオプションがあります。
- JVMが実際に終了するのを防ぎ、JProfiler GUIが接続されている間は人工的に生存させておくことができます。IDEからテストケースをプロファイリングしていて、IDEのテストコンソールでステータスと合計時間を確認したい場合には、これは望ましくない場合があります。
- JVMが終了したときにスナップショットを保存し、すぐにそれに切り替えるようJProfilerに要求できます。 スナップショットは一時的なものであり、最初にSave Snapshotアクションを使用しない限り、セッションを閉じると破棄されます。
トリガーによるスナップショットの保存
自動化されたプロファイリングセッションの最終結果は、常にスナップショットまたは一連のスナップショットです。 トリガーには、プロファイルされたJVMが動作しているマシンにスナップショットを保存する「Save a snapshot」アクションを追加できます。ライブセッション中にトリガーが実行されると、スナップショットはリモートマシンにも保存され、すでにJProfiler GUIに送信されたデータの一部が含まれない場合があります。
トリガーによるスナップショット保存には2つの基本的な戦略があります:
- テストケースの場合、「JVM startup」トリガーで記録を開始し、JVMが終了したときにスナップショットを保存するために「JVM exit」トリガーを追加します。
- 「CPU load threshold」トリガーのような例外的な条件や、「Timer trigger」による定期的なプロファイリングの場合、間に「Sleep」アクションを挟んでデータを記録した後にスナップショットを保存します。
HPROFヒープスナップショット
ヒープスナップショットの取得によるオーバーヘッドが大きすぎる場合やメモリを消費しすぎる場合、JVMが組み込み機能として提供するHPROFヒープスナップショットを使用できます。 この操作にはプロファイリングエージェントが不要なため、本番環境で動作しているJVMのメモリ問題の分析に役立ちます。
JProfilerでは、このようなスナップショットを取得する方法が3つあります:
- ライブセッションの場合、JProfiler GUIはメインメニューにHPROFヒープダンプをトリガーするアクションを提供します。
-
JProfilerには、
OutOfMemoryErrorがスローされたときにHPROFスナップショットを保存する特別な「Out of memory exception」トリガーがあります。これはHotSpot JVMでサポートされている VMパラメーター-XX:+HeapDumpOnOutOfMemoryError
に対応しています。 -
JDKのjmap実行ファイルを使用して、実行中のJVMからHPROFヒープダンプを抽出できます。
JProfilerにはjmapよりも汎用性の高いコマンドラインツール
jpdumpが含まれています。プロセスを選択でき、Windowsでサービスとして実行されているプロセスに接続でき、32ビット/64ビット混在のJVMでも問題なく動作し、HPROFスナップショットファイルに自動的に番号を付けます。詳細については-helpオプションを付けて実行してください。
JDK Flight Recorderスナップショット
JProfilerはJava Flight Recorder(JFR)で保存されたスナップショットを完全にサポートしています。この場合、UIは大きく異なり、JFRの機能に合わせて調整されています。詳細についてはJFRヘルプトピックを参照してください。
AIエージェントによるスナップショット分析
JProfilerのMCPサーバーは、AIエージェントによる分析のためにJProfilerスナップショット(.jps)、HPROFファイル(.hprof)、PHDファイル(.phd)、JFR記録(.jfr)を読み込むことができます。これは、JProfiler GUIでスナップショットを記録してからAIエージェントにデータを分析させる複雑なプロファイリングシナリオで役立ちます。同じタイプの2つのスナップショットをベースライン比較のために一緒に読み込むことができます。















