JMap でヒープダンプを取得する

JDK に付属の JMap というコマンドラインツールで、ヒープメモリ内の情報を出力できる。

「ダンプ」という言葉に馴染みがなかったので今一度調べたが、要は「その瞬間」の情報をまとめて吐き出す、ということ。JMap は実行中の Java プロセスのヒープメモリに関するダンプを取れるツール、ということだ。

対象のプロセス ID を Jps で取得したら、こんな風に使う。

> jmap -dump:live,format=b,file=heap.dmp 9999

JMap には注意するべき点がある。

注意点としてはjmapを実行すると、結果が取得できるまではJavaアプリ本体の動きが停止します。特に、ヒープダンプなんて取ろうものなら、ヒープのサイズに比例して停止時間が伸びるので、停止を許容できる時間内でダンプを取得できるかはかなり微妙です…。

「その瞬間」の情報を取得するために、結果を吐き出すまでは Java アプリの動作を止めるようである。試しに JConsole でグラフを見ながら JMap を叩いたりしてみると、その様子がよく分かると思う。