JProfiler ヘルプ

スナップショット

これまで、JProfiler GUIがプロファイリングエージェントからデータを取得するライブセッションのみを見てきましたが、JProfilerはすべてのプロファイリングデータをファイルに書き出すスナップショットにも対応しています。これは、いくつかのシナリオで有利となります。

  • 例えばテストの一部としてプロファイリングデータを自動的に記録し、JProfiler GUIで接続できない場合。
  • 異なるプロファイリングセッションのデータを比較したい場合や、過去の記録を確認したい場合。
  • プロファイリングデータを他の人と共有したい場合。

スナップショットには、すべての記録データが含まれており、ヒープスナップショットも含まれます。ディスク容量を節約するため、スナップショットは圧縮されますが、ヒープウォーカーのデータは直接メモリマッピングできるように非圧縮のままとなります。

JProfiler GUIでのスナップショットの保存とオープン

ライブセッションをプロファイリングしている際は、スナップショットの保存ツールバーボタンでスナップショットを作成できます。JProfilerはリモートエージェントからすべてのプロファイリングデータを取得し、「.jps」拡張子のローカルファイルとして保存します。ライブセッション中に複数のスナップショットを保存することも可能です。これらは自動的には開かれず、プロファイリングを継続できます。

保存されたスナップショットは自動的にファイル→最近のスナップショットメニューに追加されるため、直前に保存したスナップショットを簡単に開くことができます。ライブセッションがまだ実行中にスナップショットを開く場合、ライブセッションを終了するか、別のJProfilerウィンドウで開くかを選択できます。

JProfilerでスナップショット比較機能を使用すると、現在のライブセッションで保存したすべてのスナップショットがリストに表示されます。これにより、異なるユースケースの比較が簡単に行えます。

一般的には、メインメニューのセッション→スナップショットを開くからスナップショットを開くか、ファイルマネージャーでスナップショットファイルをダブルクリックして開くことができます。JProfilerのIDE統合機能でも、IDE自体のファイルを開くアクションからJProfilerスナップショットを開くことが可能です。その場合、組み込みのソースコードビューアーではなく、IDE内でソースコードナビゲーションが利用できます。

スナップショットを開くと、すべての記録アクションは無効化され、記録済みデータを持つビューのみが利用可能となります。どの種類のデータが記録されているかを確認するには、ステータスバーの記録ラベルにマウスカーソルを合わせてください。

短命なプログラムのプロファイリング

ライブセッションの場合、すべてのプロファイリングデータはプロファイルされたJVMのプロセス内に存在します。そのため、プロファイルされたJVMが終了すると、JProfilerのプロファイリングセッションも終了します。JVM終了後もプロファイリングを継続したい場合、セッション開始ダイアログで有効にできる2つのオプションがあります。

  • JVMが実際に終了するのを防ぎ、JProfiler GUIが接続されている間は人工的にJVMを生存させることができます。ただし、IDEからテストケースをプロファイリングしていて、IDEのテストコンソールでステータスや合計時間を確認したい場合には望ましくない場合があります。
  • JVMが終了した際にJProfilerにスナップショットを保存させ、すぐにそのスナップショットに切り替えることができます。このスナップショットは一時的なもので、セッションを閉じると破棄されますが、先にスナップショットの保存アクションを実行すれば保存できます。

トリガーによるスナップショットの保存

自動化されたプロファイリングセッションの最終結果は、常にスナップショットまたは一連のスナップショットとなります。トリガーでは、「スナップショットを保存」アクションを追加して、プロファイルされたJVMが動作しているマシン上にスナップショットを保存できます。ライブセッション中にトリガーが実行された場合、スナップショットはリモートマシンにも保存され、すでにJProfiler GUIに転送済みのデータが含まれない場合があります。

トリガーでスナップショットを保存する基本的な戦略は2つあります。

  • テストケースの場合、「JVM起動」トリガーで記録を開始し、「JVM終了」トリガーでJVM終了時にスナップショットを保存します。
  • 「CPU負荷しきい値」トリガーのような例外的な条件や、「タイマートリガー」を使った定期的なプロファイリングの場合は、「スリープ」アクションを間に挟んでデータを記録した後にスナップショットを保存します。

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ヘルプトピックをご覧ください。