Java Memory Profiler

Java のメモリやその他のプロファイルをリアルタイムで見ることができる JMP (Java Memory Profiler) というツールを使ってみた。環境は LinuxWindowsでも動くらしいが、GTK+が必要。
http://www.khelekore.org/jmp/index.html が本家。現時点で最新の jmp-0.47.tar.gz を取ってきて展開。環境変数 JAVA_HOME に JDK へのパス(/usr/local/j2sdk1.4.2 など)を設定しておいて、./configure; make; make install で /usr/local/lib に libjmp.so などが入る。JMP は jvmpi.h と jni_md.h を参照しているようなのでこれらの構造が違うならば各 JDK ごとにコンパイルする必要がありそうだが、Sun JDK 1.4.2, Sun JDK 1.5.0, IBM JDK 1.4.2 では同一の libjmp.so で正しく動いているように見える。

ドキュメントは丁寧な users_guide が ps や pdf で置いてあるのでそれを読む。作者は英語ネイティブでないようなので微妙に変な英語なのが微笑ましい。

JMP を用いるには -Xrunjmp オプションを付けて、

> java -Xrunjmp HelloWorld

とすればよいのだが、すぐに終了してしまうプログラムだと一瞬だけJMPのウィンドウが出てすぐに消えて終了してしまうので、あまり意味がない。ある程度長い時間走るプログラムの挙動を観察するのが面白いのである。

JMPのメインウィンドウはこんな感じで、これは SPECjvm98 の _213_javac を走らせているところ。ピンクがヒープ全体で、緑が生きているオブジェクトを表す。これが1秒に1回くらいペースで更新されていく様子を見るのは楽しい。Sun の JDK で JMP を用いると実行が非常に遅くなるので、ゆっくり見ている暇がある。

JMP には他にメソッド毎とオブジェクトタイプ毎の統計をリアルタイム表示するウィンドウがそれぞれある。


各行を右クリックしてメニューを選んでいくことで、「そのメソッドが割り当てたオブジェクトは何か」「そのオブジェクトを割り当てたメソッドはどれか」「そのオブジェクトを指しているオブジェクトはどれか」「そのオブジェクトが指しているオブジェクトはどれか」などがわかる。商用のツールは使ったことがないが、フリーなソフトとしてそれなりに便利な気がする。

ちなみに IBM JDK 1.4.2 で JMP を用いると、Sun JDK に比べてかなり実行が速いのでゆっくり見ている暇がない。