2014年2月15日土曜日

javaのOutOfMemory時のヒープの分析にチャレンジ(MemoryAnalyzer)

前回でjhatを使ってOOM時のヒープ分析を試みたが、時間がかかってしょうがないので、断念。次にEclipseのMemoryAnalyzerを使ってみる。

1.MemoryAnalyzer(MAT)のインストール

 MATには、EclipseのPlug-inと、Standalone版があるらしいので、今回はStandaloneで試す。
 Versionは現時点(2014/2/15)で1.3.1だった。

http://www.eclipse.org/downloads/download.php?file=/mat/1.3.1/rcp/MemoryAnalyzer-1.3.1.20140107-win32.win32.x86_64.zip

 これを解凍して、適当なフォルダにコピーすれば完了らしい(Javaは1.5以上が必要)。

2.起動しMATにhprofデータを読み込ませる

 上記コピーしたフォルダのMemoryAnalyzer.exeを起動すると画面が出てくる。
 ここからダンプファイルを開いて、「Leak Suspects Report」を選択すると、以下のような画面が出てくる。

 うーん、jhatと比べて圧倒的に速いです。
 上記画面から「Dominator tree」を選択すると、classとヒープ消費(Retained Heap)の一覧がでてくるので、「Retained Heap」順にソートして、消費量の大きなClassをたどると、大きなものがあるのか?小さなものが沢山あるのか?がわかる。
 ただし、これがメモリリークなのかただ負荷がかかったのか?はOOM前のヒープダンプを取得して、比較しながら進める必要がある。その場合は、Javaのオプションも追加して対応が必要。

 これでおおよそ、OOMが出た原因は判明する。このレベルであれば楽ちんでしたね。

0 件のコメント:

コメントを投稿