Quitada ブログ HAX

Hatena Blog でも Quitada ブログ

Java ヒープ領域のメモリリーク発見支援ツール - 結果ソート機能の強化

以前のブログエントリーで、Java ヒープ領域のメモリリーク発見支援ツールとして、以下のような jmap コマンドを実行して取得したヒストグラム比較して、オブジェクト数の差分でソートして降順で出力するというツールを作ったので晒してみました。

jmap -histo:live [対象 Java アプリケーションのプロセス ID]

2 日前に、こちらのブログエントリーにあるとおり、結果をバイト数の差分でソートする機能を追加したばかりですが、差分を昇順でソートしたりクラス名でソートしたりできたら便利かも?と思い、機能追加してみました。以下、version 0.3 として、Runnable jar なファイルとソースコードを添付します。

ソースコードは見る価値は特にないです。使い方ですが、前バージョン同様、添付 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: 今月中に対応したい
    • ソート用に用意している java.util.Comparator を実装したクラスが、ソート対象が増える度に増加しているので、そうならないようソースコード見直したい
    • コンソール表示の見直し(数値の大小によって、表示が各カラムからずれてしまうので)
    • API 公開 + Javadoc 整備して、Javadoc はどこかでネットに晒してみる
    • イレギュラーなオプション指定(ヒストグラムファイル名の間に指定したり)への対処
    • ヘルプとかエラーメッセージを日本語対応したい
    • イレギュラーなヒストグラムへのエラーハンドリング対応(今は、例外メッセージとスタックをだしているだけなので)
  • バージョン 0.4: 来月中に作りたい
    • ヒストグラムのファイルを 1 つだけ指定した場合も動作するようにする(差分は出さずに、指定した通りにソートするだけ)
    • 結果出力フォーマット多様化(CSV 対応とか)
  • バージョン 1.0: 今年中に作りたい・対応したい
    • GUI の提供。ナイスな GUI 開発ツールを選定したいところ
    • Java スレッドダンプ解析とかに有用な、GUI tail ツール「」みたいなイケメンな名前をつけたい
    • 専用 Web サイト開設
  • バージョン 2.0 or later: できるかどうか不明なので予定は未定
    • ヒープダンプも読み込めるようにしたい
    • プロセスアタッチして、定期的にオブジェクトカウントの差分とか取得する機能の追加
    • tail -f みたいにヒストグラムを抽出して、オブジェクトカウントの差分とか取得する機能の追加
    • 他の JVM 実装のヒストグラムフォーマットへの対応