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