Javaでメモリリークを調査するため、hprofを利用してメモリプロファイルを行うことがある。
hprofはJVMの起動オプションを指定してプロファイルをとる代物であるが、若干もさっとするし、何よりよく落ちる・・・Tomcatを起動していたらTomcatもろとも道連れになり実用に耐えません・・・
HPROF ERROR: Cannot allocate malloc memory [hprof_util.c:160] HPROF TERMINATED PROCESS
これでは使い物にならんと思って調べていたら、jmapというツールが存在することを発見。jmapはJVMのPIDを指定することでヒープデータを取得することが可能なツール。これを使えば↑の用にhprofが落ちて困ることは回避可能となる。jmapはJDKに付属している(JREには付属していない)。以下使い方。
# jmap -dump:format=b,file=<ダンプファイル> <pid>
heapダンプを取得後は、jhatで解析。jhatについては「Java SE 6完全攻略」 第5回 プロファイラ hprofとよき相棒 jhatの説明が詳しいので割愛するが、heapダンプサイズが大きい場合、java.lang.OutOfMemoryError: Java heap spaceが出ます。。heapサイズを調整して起動すればいいんですけどね。
# jhat -J-Xmx1024m <ダンプファイル>
なれてくるとJavaって便利ですね。