JavaCoreとHeapDumpを読む

男子たるものJVMと仲良くせねばなりません。
仲良くなるにはまず相手のことを良く知ることから始めましょう。

Coreダンプを読むには

至極一般的なCoreといえばこれ。基本ツールに食わせてうはうは言いながら見るといい。


IBMのダンプアナライザはここからDLできる。
http://www.alphaworks.ibm.com/tech/jca/download
侍もみやすい。
http://yusuke.homeip.net/samurai/ja/index.html

HeapDumpを読むには

Coreだけじゃ満足できない時はHeapも見る。てかJavaHeap内のメモリ使用状況の解析をしたいならHeapDumpをみなくちゃ始まりません。
普通にHeapDumpを解析するならGUIでみるのが一番。
IBMからでてるHeapAnalyzerを使うのがベター。
メモリが少ないと動かなくなるのでXmxを指定して起動するのがデフォ

java -jar -Xmx768M ha36.jar

phdを食わせてあげると色々見れます。便利です。
メモリリークなら以下のような手順で調査します。
オブジェクトサイズの計測とメモリリークの検出 (1/2):CodeZine(コードジン)

HeapDumpをテキストで読みたい

出力の仕方にもよりますがバイナリで出力されてたりします。
ツールに食わせるにはバイナリじゃないと駄目ですが、人としてテキストで見たくなったりもします。
そんな時はsvcdump.jarHR207.jarを入手して

java -Xbootclasspath/p:svcdump.jar -Xmx768M -jar HR207.jar -i HEAPDUMP.phd

と打つとバイナリダンプを読み込んでくれます。んで

save-txt

と打つことでファイルに吐いてくれる。
ちなみに50MぐらいのバイナリヒープをTxtにすると300Mぐらいに膨れるので注意。まあ当然ですが。

尚、ダンプがうまくとれていないと

Fatal exception    : java.lang.Error: Unexpected error: java.io.EOFException
        at HR.input.NPHDParserImpl.(NPHDParserImpl.java:96)

といった感じで読み込めないことがある模様。なんでファイルが壊れてしまっているかはわからないっす><