Quitada ブログ HAX

Hatena Blog でも Quitada ブログ

Java ヒープ領域のメモリリーク発見支援ツール - きちんとした API の提供

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

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

1 ヶ月くらい前に、こちらのブログエントリーにあるとおり、主に API の整備が目的のマイナーアップデートです(個人的には、ソースコード管理に Google Code を使うようになってからの最初のリリースだ!という思いはありますが)。以下、version 0.4.5 として、Runnable jar なファイルとソースコードを添付、ならびに Javadoc を晒します。

ソースコードは見る価値は特にないです(だいぶ作り替えて工夫したので、個人的には今回はビッグリリースだと思ってますが)。使い方ですが、前バージョン同様、添付 jar ファイルを CLASSPATH に通した状態で以下のコマンドを実行してもよいですし…

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

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

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

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

java -jar JavaObjDiff-v0.4.5.jar --help

今回のメインは API の整備です。今までは、API とはいっても、JavaObjectDiff オブジェクトを作って、CUI で最終的にコールする runMerge() メソッドをプログラムからコールできるだけで、出力も標準出力にだらだだすだけで、プログラムから使用可能な状況ではなかったですが、これは deprecated な宣言もせずに、いきなり作り替えました。すんません。今回は、MononovFactory というファクトリークラスチックなものを提供して、そこから以下のようにコールして、結果を ObjectInfo オブジェクトをソートされた配列に入れて返却するようにしました。

使い方は以下のような感じです。

import quitada.Mononov;
import quitada.MononovFactory;
import quitada.ObjectInfo;
 :
Mononov mnv = new MononovFactory()
  .setSortType("instance")
  .setSortOrder("asc")
  .setPathBefore("before.txt")
  .setPathAfter("after.txt")
  .create();

ObjectInfo[] oi = mnv.runMerge();

設定したい内容を、setXX() メソッドコールで羅列していって、最後に create() で、Mononov オブジェクトを取得できるので、それに対して runMerge() をコールします。setXX() メソッドについては、上述の Javadoc を見て、なんとか使い方を想像してください。とりあえず、サンプルコードをつけておきます(MononovFactoryTest.java 直)。こちらのサンプルにあるとおり、一部の setXX() メソッドは MononovException をスローすることがあるので、try〜catch でくくってやりましょう。

JUnit 対応は遅れそうなので、今後のロードマップを若干変更したく思います。

  • バージョン 0.5: 8 月中に対応したい
    • 自動テストツールの開発(JUnit で少なくとも API のテストを自動化したい)

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

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

    • CSV 形式で、各要素をダブルコーテーションとかシングルコーテーションとかでくくった形で出力する機能
    • オプションをプロパティファイルで指定する機能
    • 他の JVM 実装のヒストグラムフォーマットへの対応(とりあえず JRockit JVM に対応してみるか…)

Oracle Jrockit: The Definitive Guide

Oracle Jrockit: The Definitive Guide

  • バージョン 0.6: 10 月中に対応したい
  • バージョン 1.0: 今年中に作りたい・対応したい
  • バージョン 1.1 or later: できるかどうか不明なので予定は未定
    • ヒープダンプも読み込めるようにしたい
    • プロセスアタッチして、定期的にオブジェクトカウントの差分とか取得する機能の追加
    • tail -f みたいにヒストグラムを抽出して、オブジェクトカウントの差分とか取得する機能の追加
    • jconsole のプラグインとして提供
    • データサイエンティストが様々なでデータ解析できるような機能