2015年6月11日木曜日

Javaでメモリリークを調査する方法メモ

Javaのメモリリーク調査について、調べたことメモしておく。
実際にOutOfMemoryを発生させるか、定期的にログを取って増減を比較するかになるらしい。

OutOfMemoryを発生させて、スタックトレースを見る

[About:Performance]Fix Memory Leaks in Java Production Applicationsに書いてあった方法。

  • OutOfMemoryを起こします。
  • その時のメモリダンプを見ます。
  • そうするとどのクラスが原因か目星がつきます。
問題は、OutOfMemoryの発生までに数日とかかかる場合は数日待たないといけないということ・・・

ヒープとスレッドのダンプを取得して、増減を調べる

[Qiita]javaのメモリーリークを調査するより、ダンプを何回か取得して、増え続けていたり消えなかったりする奴がいないか調べる方法
  • ガーベージコレクトを実行します。
  • ヒープのダンプを取ります。(時間をあけて数回とること)
  • $JAVA_HOME/bin/jmap -dump:format=b,file=<出力ファイル名> <プロセスID>
    
  • スレッドのダンプを取ります。(時間をあけて数回とること)
  • $JAVA_HOME/bin/jstack <プロセスID> > <出力ファイル名>
    
  • VisualVMの機能で差分比較します。
VisualVMはJDKをインストールすると一緒に入ってくるツールで、JVMのメモリ使用量なんかを見れます。JREには入ってないので注意。
そのものズバリではなく、怪しい奴を探す方法。

オブジェクトヒストグラムで増えてるオブジェクトを探す

[めざせ!細マッチョ]Java ヒープ領域のメモリリーク発見支援ツール - オブジェクト数の diffより、オブジェクトのヒストグラムで比較する方法。
ツールも公開してくれてます。
  • ヒストグラムを取得します。(時間をあけて数回とること)
  • jmap -histo:live <プロセスID>
    
  • それぞれ比較して、インスタンス数が増えているものを探します。
ダンプファイルと違ってテキスト形式なので、CUIしかない環境でも使えるというのがミソ。
こちらもそのものズバリではなく、怪しい奴を探す方法。

0 comments:

コメントを投稿