3.2. Java ヒープダンプ
Java ヒープダンプは、特定時に作成された JVM ヒープのスナップショットです。ヒープダンプの作成および分析は、Java アプリケーションの問題の分析やトラブルシューティングに役立つことがあります。
JBoss EAP プロセスの Java ヒープダンプの作成および分析方法は、使用している JDK に応じて異なります。ここでは、Oracle JDK、OpenJDK、および IBM JDK での一般的な方法を取り上げます。
3.2.1. ヒープダンプの作成
3.2.1.1. OpenJDK および Oracle JDK
オンデマンドヒープダンプの作成
jcmd
コマンドを使用すると、OpenJDK または Oracle JDK で実行している JBoss EAP のオンデマンドヒープダンプを作成できます。
- ヒープダンプを作成する JVM のプロセス ID を判断します。
以下のコマンドでヒープダンプを作成します。
$ jcmd JAVA_PID GC.heap_dump -all=true FILENAME.hprof
これにより、ヒープダンプファイルが HPROF 形式で作成され、通常
EAP_HOME
またはEAP_HOME/bin
に格納されます。代わりに、別のディレクトリーへのファイルパスを指定することもできます。
OutOfMemoryError での自動的なヒープダンプの作成
-XX:+HeapDumpOnOutOfMemoryError
JVM オプションを使用すると、OutOfMemoryError
例外の発生時に自動的にヒープダンプを作成することができます。
これにより、ヒープダンプファイルが HPROF 形式で作成され、通常 EAP_HOME
または EAP_HOME/bin
に格納されます。代わりに、-XX:HeapDumpPath=/path/
を使用してヒープダンプのカスタムパスを設定することもできます。-XX:HeapDumpPath=/path/filename.hprof
のように -XX:HeapDumpPath
を使用してファイル名を指定すると、ヒープダンプはお互いに上書きされます。
JVM オプションを適用する方法は、JBoss EAP『設定ガイド』(スタンドアロンサーバーへの適用 または 管理対象ドメインのサーバーへの適用) を参照してください。
3.2.1.2. IBM JDK
IBM JDK を使用している場合、ヒープダンプは OutOfMemoryError
の発生時に自動的に生成されます。
IBM JDK のヒープダンプは、portable heap dump (PHD) 形式ファイルとして /tmp/
ディレクトリーに保存されます。
3.2.2. ヒープダンプの分析
ヒープダンプ分析ツール
ヒープダンプを解析し、問題の特定を手助けするツールは多く存在します。Red Hat は、HPROF または PHD 形式でフォーマットされたヒープダンプを解析できる Eclipse Memory Analyzer ツール (MAT) の使用を推奨します。
Eclipse MAT の使用に関する詳細は、Eclipse MAT のドキュメント を参照してください。
ヒープダンプ解析のヒント
ヒープパフォーマンスの問題の原因が明白であることもありますが、アプリケーションのコードや、OutOfMemoryError
のような問題を引き起こす状況を理解する必要があることもあります。これにより、メモリーリークの問題であるかまたはヒープのサイズが小さすぎるのかを特定することができます。
メモリー使用率の問題特定に推奨される方法には以下が含まれます。
- メモリーを大量に消費している単一のオブジェクトが見つからない場合、クラスでグループ化して、多くの小さなオブジェクトが大量のメモリーを消費していないか確認します。
-
最もメモリーを使用しているのが 1 つのスレッドであるかを確認します。これには、
OutOfMemoryError
によって引き起こされたヒープダンプが指定のXmx
最大ヒープサイズよりも大幅に小さいかどうかを確認するとよいでしょう。 -
通常の最大ヒープサイズを一時的に 2 倍にすると、メモリーリークをより検出しやすくなります。
OutOfMemoryError
の発生時、メモリーリークに関連するオブジェクトのサイズはヒープのサイズの約半分になります。
メモリー問題の原因を特定したら、ガベッジコレクションのルートからパスを確認し、オブジェクトが何によって維持されているかを確認します。