Quitada ブログ HAX

Hatena Blog でも Quitada ブログ

Tool to find slow memory leak of java applications - version 0.2

I'm pleased to announce that I've released the version 0.2 of the following my tool to find slow memory leak of java applications.

Tool to find slow memory leak of java applications

 

You can download the jar file of version 0.2 from here(src). You can just execute this as a Java appliction with adding this jar file to CLASSPATH. The usage is similar to UNIX diff command like the following.
-----
java quitada.JavaObjectDiff [java histogram file before memory leak] [java histogram file after memory leak]
-----

 

And also, this release is built as a runnable jar. So you can execute this tool with the following command line.

-----

java -jar JavaObjDiff-v0.2.jar [java histogram file before memory leak] [java histogram file after memory leak]

-----

 

In this release, you can additionally see the following output showing the difference of the bytes of each obejcts and sort them in descending order like the following.

-----

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            <constMethodKlass>
10244            245856            java.util.concurrent.ConcurrentHashMap$HashEntry
5632            210472            [Ljava.util.concurrent.ConcurrentHashMap$HashEntry;
5632            180224            java.util.concurrent.ConcurrentHashMap$Segment
211            179104            <constantPoolKlass>
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

 :

-----

 

To do this, please simply add --sort:byte option lile the following.

-----

java -jar JavaObjDiff-v0.2.jar --sort:byte [java histogram file before memory leak] [java histogram file after memory leak]

-----

 

For details of new options, please execute the following command with --help options.

-----

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

-----

 

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 実装のヒストグラムフォーマットへの対応

My ブログエントリ 5/4 以前版

5/4 以前の My ブログエントリを列挙します。

NYBOT 砂糖 11 号価格

明治プロビオヨーグルト LG21 ドリンクタイプ

明治プロビオヨーグルトLG21ドリンクタイプ 【112ml×24本】

明治プロビオヨーグルトLG21ドリンクタイプ 【112ml×24本】

NYBOT 砂糖 11 号価格

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 実装のヒストグラムフォーマットへの対応

My ブログエントリ 4/1 以前版

4/1 以前の My ブログエントリを列挙します。

NYBOT 砂糖 11 号価格

宮崎製糖 玉砂糖 1kg

宮崎製糖 玉砂糖 1kg

au も「おサイフケータイ」発売

JR 線車両が日本テレコムの実験室に!

新宿御苑にて花見

もうさすがに今年の花見は先週があきらかにピークだっただろうとは思いつつも、かなり前から予定していたので、天気は曇りで寒かったけど、新宿御苑に花見にいきました。

今週は先週とはうって変わって寒かったためか、それほど散ってなくて、一回りして八分咲きみたいな、そんな印象。良かったです。

ともあれ、寒かったです。

そして、御苑は酒持ち込み禁止で、入り口でかばんのチェックまでしてるけど、例によって、御苑内ゴミ箱にはなぜかビールやらチューハイの空き缶が捨ててありましたね。ぐはぁ。

My ブログエントリ 3/29 以前版

3/29 以前の My ブログエントリを列挙します。

NYBOT 砂糖 11 号価格

港区縦断!立ち呑み歩きツアー

るるぶ港区 (るるぶ情報版―関東)

るるぶ港区 (るるぶ情報版―関東)

NYBOT 砂糖 11 号価格