Locked History Actions

java/MemoryLeaks

メモリリークの解消法

ガベージコレクション頻度のログをとり、それを可視化する

目的:GCの頻度とヒープ領域使用量のざっくりとした状況を把握する。

VM引数の-Xloggcを使用して、GCのログをファイルに記録する。

以下はlogディレクトリのgc.logファイルに書き込む例。

java -Xloggc:log/gc.log server.jar

GCViewerを使う

gcviewerをインストールし、先のgc.logを読み込ませる。

gcviewer.png

グラフの各要素の意味は以下の通り。

gcviewer2.png

Eclipse Memory Analyzerを使う

目的:メモリリークが確実な場合に、リークの原因(どのオブジェクトがリークしているか)を把握する。

実行中のVMのヒープ状態をダンプする

JDKに付属のjmapコマンドを使用する。

Linuxの場合

jmap -heap:format=b プロセス番号

Windowsの場合

jpsコマンドを使用して実行中のVMのプロセス番号を特定する。

jmap -dump:format=b,file=heap.bin プロセス番号

いずれの場合にもheap.binというファイルにヒープ状態が格納される。

Eclipse Memory Analyzer(MAT)を使う

利用中のEclipseに組み込む必要はない。スタンドアロンのアプリケーションを以下からダウンロードし、解凍して実行する。 http://www.eclipse.org/mat/

heap.binの準備

MATにheap.binを読み込ませると、heap.binと同じフォルダに作業用ファイルを勝手に作成してしまう。このため、新しいフォルダを作成してそこにheap.binを移動しておく。

heap.binの読込み

File>Open Heap Dumpで読み込ませる。