読者です 読者をやめる 読者になる 読者になる

「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 で調べてあげる。
jps - Java 仮想マシンプロセスステータスツール
http://docs.oracle.com/javase/jp/7/technotes/tools/share/jps.html

jhat でヒープダンプを解析する。

jhat snapshot.jmap

デフォルトだとポート 7000 で Web サーバが起動します。
Web ブラウザからアクセスすると、以下のような画面が見えます。

f:id:a4dosanddos:20140302130119p:plain

細かい見方とかは全然調べてないですが、例えば、「Show heap histogram」をクリックすると、ヒープ内のオブジェクトの状況的なのが確認できます ( インスタンスの数、サイズなど )。ここで、Test インスタンスのを確認してみると "100" ってなってました。とりあえず、ちゃんとヒープの情報は取得できている感ですかね。

f:id:a4dosanddos:20140302130458p:plain


ヒープダンプの解析は、例えば OutOfMemoryError とかで、ヒープの不足が「ヒープの絶対量の不足なのか」、あるいは、「メモリリークしているのか」とか調べる時に使うんですかね。

以上です。

< 環境情報 >
CentOS 6.2
Java SE 7 Update 51