HotSpot JVMとAndroid Runtimeは、どちらもHPROF形式のヒープスナップショットをサポートしています。 IBM J9 JVMは、このようなスナップショットをPHD形式で書き出します。PHDファイルにはガベージコレクタールートが含まれていないため、 JProfilerはクラスをルートとしてシミュレートします。PHDファイルではクラスローダーのメモリリークを見つけるのが困難な場合があります。
ネイティブヒープスナップショットはプロファイリングエージェントなしで保存でき、汎用APIの制約を受けずに保存されるため、JProfilerのヒープスナップショットよりもオーバーヘッドが小さくなります。その反面、ネイティブヒープスナップショットがサポートする機能はJProfilerのヒープスナップショットよりも少なくなります。例えば、割り当て記録の情報は利用できないため、オブジェクトがどこで割り当てられたかを確認することはできません。HPROFおよびPHDスナップショットは、JProfilerスナップショットを開くのと同様に、セッション→スナップショットを開くを使用してJProfilerで開くことができます。利用できるのはヒープウォーカーのみで、その他のセクションはすべてグレーアウトされます。
ライブセッションでは、プロファイリング→HPROFスナップショットの保存または
プロファイリング→PHDスナップショットの保存アクションを呼び出すことで、HPROF/PHDヒープスナップショットを作成して開くことができます。
オフラインプロファイリング用には、「HPROF/PHDヒープダンプの作成」トリガーアクションがあります。
これは通常、OutOfMemoryErrorがスローされたときにHPROFスナップショットを保存するために、「メモリ不足例外」トリガーとともに使用されます。
これは、HotSpot JVMでサポートされている VMパラメータ
-XX:+HeapDumpOnOutOfMemoryError
に対応しています。
稼働中のシステムからHPROFヒープダンプを抽出するもう1つの方法は、JDKに含まれているコマンドラインツール
jmap
を使用することです。その呼び出し構文
jmap -dump:live,format=b,file=<filename> <PID>
は覚えるのが難しく、事前にPIDを調べるために jps実行可能ファイルを使用する必要があります。JProfilerには、はるかに便利な対話型のコマンドライン実行可能ファイル
bin/jpdump
が付属しています。これを使用すると、プロセスを選択でき、Windows上でサービスとして実行されているプロセスにも接続可能で、32ビット/64ビットが混在するJVMにも問題なく対応し、HPROFスナップショットファイルに自動で連番を付与します。詳細については、
-helpオプションを付けて実行してください。
プロファイリングエージェントをロードせずにHPROFヒープスナップショットを取得することは、JProfiler GUIでもサポートされています。 ローカルまたはリモートでプロセスにattachする場合、常に単にHPROFヒープスナップショットのみを取得することも可能です。
HPROFスナップショットにはスレッドダンプを含めることができます。OutOfMemoryErrorの結果としてHPROFスナップショットが保存された場合、スレッドダンプからエラー発生時にアプリケーションのどの部分がアクティブであったかを把握できることがあります。エラーをトリガーしたスレッドには特別なアイコンが付けられます。





