以前のブログエントリーで、Java ヒープ領域のメモリリーク発見支援ツールとして、以下のような jmap コマンドを実行して取得したヒストグラム比較して、オブジェクト数の差分でソートして降順で出力するというツールを作ったので晒してみました。
jmap -histo:live [対象 Java アプリケーションのプロセス ID]
2 日前に、こちらのブログエントリーにあるとおり、結果をバイト数の差分でソートする機能を追加したばかりですが、差分を昇順でソートしたりクラス名でソートしたりできたら便利かも?と思い、機能追加してみました。以下、version 0.3 として、Runnable jar なファイルとソースコードを添付します。
- Runnable jar: JavaObjDiff-v0.3.jar
- ソースコード: JavaObjDiff-v0.3-src.zip
ソースコードは見る価値は特にないです。使い方ですが、前バージョン同様、添付 jar ファイルを CLASSPATH に通した状態で以下のコマンドを実行してもよいですし…
java quitada.JavaObjectDiff [メモリリーク前のヒストグラムファイル] [メモリリーク後のヒストグラムファイル]
Runnable jar なので、以下でもよいです。
java -jar JavaObjDiff-v0.3.jar [メモリリーク前のヒストグラムファイル] [メモリリーク後のヒストグラムファイル]
このままだと、前バージョン同様、オブジェクト数の差分でソートして結果を降順で出力します。たとえば、クラス名でソートして結果を(記号・アルファベットの)昇順で出力するには、以下のように --sort:class --order:asc と指定します。
java -jar JavaObjDiff-v0.3.jar --sort:class --order:asc [メモリリーク前のヒストグラムファイル] [メモリリーク後のヒストグラムファイル]
以下、出力例です。
Sorted by class name in ascending order.
diff of #instances diff of #bytes class name
------------------ ------------------ ----------
79 1264
1739 301136
187 117464
211 179104
1739 139120
10 3280
2429 122440
10828 731832 [B
601 51456 [C
:
0 0 sun.util.calendar.ZoneInfo
0 0 sun.util.resources.LocaleData$LocaleDataResourceBundleControl
詳しい使い方とか、シュガーシンタックス的なものは、--help オプションで確認してください。
java -jar JavaObjDiff-v0.3.jar --help
実は、--sort のサブオプションをちょっと変えてしまったので、v0.2 とはいきなり非互換発生です。ぐはぁ。で、散歩していたらいくつか新しい機能追加についても思いついたので、今後のロードマップを若干変更したく思います。
- バージョン 0.3.5: 今月中に対応したい
- バージョン 0.4: 来月中に作りたい
- バージョン 1.0: 今年中に作りたい・対応したい
- バージョン 2.0 or later: できるかどうか不明なので予定は未定