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 のオンデマンドヒープダンプを作成できます。

  1. ヒープダンプを作成する JVM のプロセス ID を判断します。
  2. 以下のコマンドでヒープダンプを作成します。

    $ 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 の発生時、メモリーリークに関連するオブジェクトのサイズはヒープのサイズの約半分になります。

メモリー問題の原因を特定したら、ガベッジコレクションのルートからパスを確認し、オブジェクトが何によって維持されているかを確認します。