daybreaksnow's diary

私を私と呼びたい

[Java]Eclipse Memory Analyzerによるメモリリーク調査

極端にメモリが少ない環境で大きいファイルを読み込んでパースしなければならない状況があり、易々とOutOfMemoryErrorが発生したので、その原因調査にEclipse Memory Analyzerを利用した。

http://www.eclipse.org/mat/
バージョンは1.2.1をダウンロードした。


利用方法は、まず、解析対象のJavaプログラムに以下のVM引数を追加して実行する。

  • XX:+HeapDumpOnOutOfMemoryError

引数名の通り、OutOfMemoryErrorが発生した場合、その時点のヒープを出力してくれる。
ダンプファイルは「java_pid6532.hprof」のような名称となった。

ダンプが取れたら、Eclipse Memory Analyzerを起動し、
File→Open Heap Dumpで上記ファイルを読みこむ。
なお、ファイル読み込みの際、ダンプファイルと同じディレクトリに解析ファイルが多数作成される。
そのため、ダンプファイルは新規フォルダに入れておいた方がよいだろう。

f:id:daybreaksnow:20130219211229p:plain

ウィザードが表示されるので、Leak Suspects Reportを選択、完了。

f:id:daybreaksnow:20130219211241p:plain



解析終了後は、OverviewタブのActionsから解析結果を閲覧できる。
今回はHistgramを使った。

f:id:daybreaksnow:20130219211744p:plain
結果を見ると、LinkedListのNodeで大量にメモリを使っていることが分かった。
そのため、LinkedListをArrayListに変更することで、メモリ消費量を抑えることができた。