Quitada ブログ HAX

Hatena Blog でも Quitada ブログ

Java ヒープ領域のメモリリーク発見支援ツール - バイト数の diff

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

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

もしかしたら、バイト数の差分でソートしたい場合もあるかも?と思い、機能追加してみました。以下、Runnable jar なファイルとソースコードを添付します。

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

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

今回は、Runnable jar にしたので、以下でもよいです。

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

このままだと、前バージョン同様、オブジェクト数の差分でソートします。バイト数の差分でソートするには、以下のように --sort:byte オプションを指定します。

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

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

java -jar JavaObjDiff-v0.2.jar --help

出力例ですが、今回のバージョンでは、以下のように、オブジェクト数の他、バイト数の差分も出力するようにしました。

Sorted by objects byte
diff of #instances diff of #bytes class name
----------------- ------------------ ----------
10828 731832 [B
10000 320000 com.gemstone.gemfire.internal.cache.VMThinRegionEntry
1739 301136
10244 245856 java.util.concurrent.ConcurrentHashMap$HashEntry
5632 210472 [Ljava.util.concurrent.ConcurrentHashMap$HashEntry;
5632 180224 java.util.concurrent.ConcurrentHashMap$Segment
211 179104
10000 160000 com.gemstone.gemfire.internal.cache.VMCachedDeserializable
9872 157952 java.lang.Integer
:
-8 -256 java.util.ResourceBundle$LoaderReference
-8 -320 java.util.ResourceBundle$BundleReference
-8 -384 java.util.ResourceBundle$CacheKey

# com.gemstone.gemfire.…といったパッケージ名は気にしないように…。

Eclipse 4.2 完全攻略

Eclipse 4.2 完全攻略

ちなみにこの類のことができる GUI ツールとして、EclipseプラグインMemory Analyzer というのがあって、メモリリーク前後に取得したヒープダンプをかませてやるとオブジェクト数やバイト数の増減が Eclipse 上で表形式で並べて比較できます。やり方は以下のサイト様を参照願います。

メモリリークを発見!Androidアプリのメモリ解析手法

使ってみたけど、どうやら差分値はだしてくれないようなんですね(もしやり方あったら教えてほしい…)。なので、俺的ツールの存在価値もあるということで、まぁ、せっかく作ったので、今後の課題というか、ロードマップを披露したいと思います。

  • バージョン 0.3: 今月中に作りたい
    • 昇順でもソートできるようにしたい
    • クラス名でもソートできるようにしたいが、文字列でのソート方法が課題
  • バージョン 0.4: 来月中に対応したい
    • ソート用に用意している java.util.Comparator を実装したクラスが、ソート対象が増える度に増加しているので、そうならないようソースコード見直したい
    • コンソール表示の見直し(数値の大小によって、表示が各カラムからずれてしまうので)
    • API 公開 + Javadoc 整備
    • イレギュラーなオプション指定(ヒストグラムファイル名の間に指定したり)への対処
    • ヘルプとかエラーメッセージを日本語対応したい
    • イレギュラーなヒストグラムへのエラーハンドリング対応(今は、例外メッセージとスタックをだしているだけなので)
  • バージョン 1.0: 今年中に作りたい・対応したい
    • GUI の提供
    • Java スレッドダンプ解析とかに有用な、GUI tail ツール「」みたいな名前をつけたい。俺の心の中ではすでに、"Merge Objects Numerically Ordered Nonetheless On Variety" の頭文字をとって、"Mononov"(もののふ、と読む)と決めているが、関係各位と調整したい…。ちなみに、私はモノノフではない。
    • 専用 Web サイト開設
  • バージョン 2.0 or later: できるかどうか不明なので予定は未定
    • ヒープダンプも読み込めるようにしたい
    • プロセスアタッチして、定期的にオブジェクトカウントの差分とか取得する機能の追加
    • tail -f みたいにヒストグラムを抽出して、オブジェクトカウントの差分とか取得する機能の追加
    • 他の JVM 実装のヒストグラムフォーマットへの対応