以前のブログエントリーで、Java ヒープ領域のメモリリーク発見支援ツールとして、以下のような jmap コマンドを実行して取得したヒストグラム比較して、オブジェクト数の差分でソートして降順で出力するというツールを作ったので晒してみました。
jmap -histo:live [対象 Java アプリケーションのプロセス ID]
もしかしたら、バイト数の差分でソートしたい場合もあるかも?と思い、機能追加してみました。以下、Runnable jar なファイルとソースコードを添付します。
- Runnable jar: JavaObjDiff-v0.2.jar
- ソースコード: JavaObjDiff-v0.2-src.zip
ソースコードは見る価値は特にないです。使い方ですが、前バージョン同様、添付 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.…といったパッケージ名は気にしないように…。
- 作者: 宮本信二
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2012/10/27
- メディア: 大型本
- 購入: 1人 クリック: 8回
- この商品を含むブログ (5件) を見る
使ってみたけど、どうやら差分値はだしてくれないようなんですね(もしやり方あったら教えてほしい…)。なので、俺的ツールの存在価値もあるということで、まぁ、せっかく作ったので、今後の課題というか、ロードマップを披露したいと思います。
- バージョン 0.3: 今月中に作りたい
- 昇順でもソートできるようにしたい
- クラス名でもソートできるようにしたいが、文字列でのソート方法が課題
- バージョン 0.4: 来月中に対応したい
- バージョン 1.0: 今年中に作りたい・対応したい
- バージョン 2.0 or later: できるかどうか不明なので予定は未定