Quitada ブログ HAX

Hatena Blog でも Quitada ブログ

Java ヒープ領域のメモリリーク発見支援ツール - 日本語対応とか

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

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

6 日前に、こちらのブログエントリーにあるとおり、差分を昇順でソートしたりクラス名でソートしたりできるように機能追加しましたが、今回は日本語対応(I18NL10N)とかしてみました。以下、version 0.3.5(新機能とか特にないので、v0.3 ベース扱い) として、Runnable jar なファイルとソースコードを添付します。

ソースコードは見る価値は特にないです(とはいえ色々と苦心してますが)。使い方ですが、前バージョン同様、添付 jar ファイルを CLASSPATH に通した状態で以下のコマンドを実行してもよいですし…

java quitada.JavaObjectDiff [メモリリーク前のヒストグラムファイル] [メモリリーク後のヒストグラムファイル]

Runnable jar なので、以下でもよいです。

java -jar JavaObjDiff-v0.3.5.jar [メモリリーク前のヒストグラムファイル] [メモリリーク後のヒストグラムファイル]

今回は日本語対応したので、日本語環境で実行すると以下のように日本語で出力されます(表示ずれ防止のため、等幅フォントの利用推奨)。

インスタンス数で降順にソート
インスタンス数の差分 バイト数の差分 クラス名
-------------------- -------------- --------
10828 731832 [B
10244 245856 java.util.concurrent.ConcurrentHashMap$HashEntry
10000 320000 com.gemstone.gemfire.internal.cache.VMThinRegionEntry
10000 160000 com.gemstone.gemfire.internal.cache.VMCachedDeserializable
9872 157952 java.lang.Integer
5789 138936 java.util.concurrent.locks.ReentrantLock$NonfairSync
5632 180224 java.util.concurrent.ConcurrentHashMap$Segment
:

どうしても英語で表示したい場合は、以下のように、-Duser.language=en とかつければいいでしょう。

java -Duser.language=en -jar JavaObjDiff-v0.3.5.jar ....

詳しい使い方とか、シュガーシンタックス的なものは、--help オプションで確認してください。

java -jar JavaObjDiff-v0.3.5.jar --help

今回は、色々見直し中心のリリースで、日本語対応の他にも以下の対応をしてます。

  • ソート用に用意している java.util.Comparator を実装したクラスが、ソート対象やソート順指定が増える度に増加していたので、共通クラス 1 つにした
  • コンソール表示の見直し(数値の大小によって、表示が各カラムからずれてしまっていたので)
  • API 公開 + Javadoc 整備して、Javadocこちらに晒してます
  • イレギュラーなオプション指定(ヒストグラムファイル名の間に指定したり)への対処
  • イレギュラーなヒストグラムへのエラーハンドリング対応(以前は、例外メッセージとスタックをだしていただけなので)

機能追加以外にも色々と対応したいことがでてきたので、今後のロードマップを若干変更したく思います。

  • バージョン 0.4: 今月中に作りたい
    • ヒストグラムのファイルを 1 つだけ指定した場合も動作するようにする(差分は出さずに、指定した通りにソートするだけ)
    • 結果出力フォーマット多様化(CSV 対応とか、標準の出力フォーマットで、表示をそろえるために使っている tab の文字数とか)
  • バージョン 0.4.5: 来月までに対応したい
    • Google code を使った開発体制の確立
    • API 見直し(非互換発生予定)
      • 例外ハンドリングを main 関数側にたおして、API として使いやすくする
      • ファクトリーメソッドの提供
      • 結果を標準出力にだすだけでなくて、配列で返すとか、アプリケーションに組み込んで使用しやすくする
    • ロジック見直し:差分を計算するロジックと、ソートするロジックのメソッド分割とか
    • 自動テストツールの開発(JUnit とかですかね…)
  • バージョン 0.5: 7 月中に対応したい
    • CSV 形式で、各要素をダブルコーテーションとかシングルコーテーションとかでくくった形で出力する機能
  • バージョン 1.0: 今年中に作りたい・対応したい
    • GUI の提供。ナイスな GUI 開発ツールを選定したいところ
    • Java スレッドダンプ解析とかに有用な、GUI tail ツール「」みたいなイケメンな名前をつけたい
    • 専用 Web サイト開設
  • バージョン 2.0 or later: できるかどうか不明なので予定は未定
    • ヒープダンプも読み込めるようにしたい
    • プロセスアタッチして、定期的にオブジェクトカウントの差分とか取得する機能の追加
    • tail -f みたいにヒストグラムを抽出して、オブジェクトカウントの差分とか取得する機能の追加
    • 他の JVM 実装のヒストグラムフォーマットへの対応

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)