スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
ブログランキングに参加しています。応援クリックいただけると嬉しいです♪
FC2ブログランキング
人気ブログランキングへ

メモリーリークを発見するツール

ここしばらく私が仕事で取り組んでいることの一つは、メモリーリークを発見するツールを書くことです。

私たちのチームが開発しているのは、Eclipseのようなプラグインアーキテクチャを持つアプリケーションです。このアプリにインストールされるプラグインは、そのプラグインが持つクラスをロードするのに、それぞれ各自のクラスローダーを使います。

そのプラグインがアンインストールされた後も、もしそのクラスローダーがまだメモリの中に残っていたら、メモリーリークが起きているというわけです。

このツールを作ろうと思ったきっかけは、メモリーリークを後から発見するのではなく、リークが最初に起きた時にすぐ発見できるツールがあるといいのになと思ったことです。それができる一つの方法が、プラグインをアンインスールした時に、そのプラグインのクラスローダーがまだメモリの中に残っているかを確認することです。

ここで問題なのは、まず、どうやってそんなツールを作れるか?それと、メモリーリークを発見する時間や労力を最小限にするために、そのツールをどう利用することができるか?ということでした。

単にメモリーリークを発見するためなら、そのためのツールもたくさんあると思います。例えばJProfilerという製品もありますが、私はオートメーションできるツールが欲しかったので、これは私の目的には合いませんでした。

ヒープダンプファイルを作成するようなプログラムを書いてもいいのですが、そういうファイルはどうしても大きくなりすぎてしまう・・・・・・・。

私にとって理想的なのは、自分が探しているオブジェクト(この場合はクラスローダーですね)を探して、メモリをスキャンしてくれるツールなわけです。

まさにそれを可能にしてくれるのが、今回発見したinsaneというライブラリです。insaneを使うと、プラグインのクラスローダーへのハードリファレンスだけを探して、JVMヒープをスキャンするツールを書くことができます。

ツールの活用法

上記のツールを使って、プラグインをアンインストールして、メモリの中にそのプラグインのクラスローダーがまだ残っているかをチェックするテストを書くことができます。

そして、新しいコードがソースコードレポジトリに追加されるたびに、そのテストを、クルーズコントロールなどの継続的ビルドプロセス用のフレームワークを使って実行すれば、どのコードがメモリーリークを引き起こしたのか、すぐに発見できるというわけです。

そのようなテストがあると、特にクルーズコントロールのようなフレームワークは、システムに新しいコードが追加されるたびに、新しく追加されたクラスや変更されたクラスなどを、リストにしてレポートしてくれるため、どのコードがメモリーリークを起こしているのか、特定しやすくなります。

そうやってメモリーリークが発見された場合、開発プロセスにもよりますが、いくつかのオプションがあります。
  • 1.新しく追加されたコードの量がそんなに多くなければ、どのコードがリークを起こしたのか、プログラマーたちがコードを読むことによって特定することができます。


  • 2.追加されたコードの量が多ければ、JProfilerなどのツールを使って、どこでメモリーリークを起こしたのか、特定できます。


  • 3.アプリケーションの安定性を保つために、メモリーリークを起こしたコードといっしょにチェックインされた全てのコードを元に戻します。そしてそのコードをチェックインしたプログラマーは、自分のコンピューターでそのコードを直し、それからまたチェックインします。


  • insaneライブラリの取得の仕方

  • 1.次のサイトからZipファイルをダウンロードします。
    http://updates.netbeans.org/netbeans/updates/6.0/uc/final/beta/modules/org-netbeans-insane.nbm
    (FireFoxを使うと、ファイルの拡張子が.nbmとなりますが、そのまま保存して、そのあと拡張子をzipに変えて下さい。)


  • 2.Zipファイルの中身を解凍します。


  • 3.netbeans/modules/というフォルダの中に、org-netbeans-insane.jarファイルがあります。


  • ライブラリの使い方などについては、次のページを参考にして下さい。このページは英語で書かれています。
    http://performance.netbeans.org/insane/

    メインとなるクラスがScannerUtils.javaなのですが、その使用例を示したDemoScanner.javaのソースコードがここで見れます。

    http://hg.netbeans.org/main/file/1f3bec2db35e/o.n.insane/insanelib/demo/src/demo/DemoScanner.java

    ブログランキングに参加しています。応援クリックいただけると嬉しいです♪
    FC2ブログランキング
    人気ブログランキングへ

    COMMENTS

    COMMENT FORM

    TRACKBACK


    この記事にトラックバックする(FC2ブログユーザー)

    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。