「Java」jhat でヒープダンプを解析してみる
jhat でヒープダンプを解析してみた。簡単な内容になりますがその時のメモです。
ヒープダンプの取得は以下のエントリーにまとめてますが、今回は jmap を使ってます。
・「Java」 ヒープダンプの取得方法 - プログラム日記
http://a4dosanddos.hatenablog.com/entry/2013/03/28/000331
※ 一応、jhat、jmap のドキュメントを。
・jhat - Java ヒープ解析ツール
http://docs.oracle.com/javase/jp/7/technotes/tools/share/jhat.html
・jmap - メモリーマップ
http://docs.oracle.com/javase/jp/7/technotes/tools/share/jmap.html
対象のソースコードは、以下の感じで作ってみました。
HeapDumpTest.java で Test のインスタンスを 100 個作って、それをリストに格納してます。
■ Test.java
package test; public class Test { private String s; private int i; public Test(String s, int i) { this.s = s; this.i = i; } }
■ HeapDumpTest.java
package test; import java.util.ArrayList; import java.util.List; public class HeapDumpTest { private List<Test> list = new ArrayList<Test>(); public static void main(String[] args) throws Exception { HeapDumpTest inst = new HeapDumpTest(); for (int i = 1; i <= 100; i++) { String s = "test" + i; inst.list.add(new Test(s, i)); } // jmap でヒープダンプ取得するために処理停止させてます Thread.sleep(Integer.parseInt(args[0])); } }
HeapDumpTest を実行して、jmap でヒープダンプを取得する。
java test.HeapDumpTest 30000 jmap -dump:format=b,file=snapshot.jmap <pid>
※
・jps - Java 仮想マシンプロセスステータスツール
http://docs.oracle.com/javase/jp/7/technotes/tools/share/jps.html
jhat でヒープダンプを解析する。
jhat snapshot.jmap
デフォルトだとポート 7000 で Web サーバが起動します。
Web ブラウザからアクセスすると、以下のような画面が見えます。
細かい見方とかは全然調べてないですが、例えば、「Show heap histogram」をクリックすると、ヒープ内のオブジェクトの状況的なのが確認できます ( インスタンスの数、サイズなど )。ここで、Test インスタンスのを確認してみると "100" ってなってました。とりあえず、ちゃんとヒープの情報は取得できている感ですかね。
ヒープダンプの解析は、例えば OutOfMemoryError とかで、ヒープの不足が「ヒープの絶対量の不足なのか」、あるいは、「メモリリークしているのか」とか調べる時に使うんですかね。
以上です。