Edited at

javaのメモリーリークを調査する

More than 3 years have passed since last update.


VisualVMを使う

<jdkのインストールディレクトリ>/bin/jvisualvm

基本的にはこれでOK

ただし、AmazonLinux等を使っていてCUIのみの環境の場合、その場で使えない。

その場合は以下


GCを起こす

$JAVA_HOME/bin/jcmd <プロセスID> GC.run


Heapdumpを取得する

Java仮想マシーン(jvm)のメモリ上の内容を取得する。複数回取得します。

$JAVA_HOME/bin/jmap -dump:format=b,file=HogeHeapDmp <プロセスID>

バイナリ形式で HogeHeapDmpという名前のファイルが作成される


jvmのプロセス IDの調べ方

$JAVA_HOME/bin/jps -l


Threaddumpを取得する

$JAVA_HOME/bin/jstack <プロセスID> > HogeThreadDmp

HogeThreadDmpという名前のファイルが作成される。複数回取得します。


後は・・・

各ファイルをローカルに持ってきてvisualvmで「ファイル」->「読み込み」で読み込めます

Heapdmpは「別のヒープダンプと比較」で増加しているインスタンスを調べる事が出来ます。

Threaddmpはずっと動いてたり(Runnable)、ロックの開放待ち状態のまま(waiting for monitor entry)

想定外のスレッドが無いか確認します。