JIP -- Java Interactive Profiler

最近技術ネタ続きですね。というか、久しぶりにコンスタントに投稿しているからそう見えているだけかもしれません。

さて、今、とあるモジュールをプロファイリングしていて、完了するのに1時間ほどかかるのでその間に使っているプロファイラについてポストします。

本当は、今やっているプロファイリングは、NetBeans Profilerを使って行うはずだったのです。ところが、NetBeans Profilerのエージェントが対象のクラスをあらかたキャッシュし終えて、そろそろ開始かなと思ったとたんに接続が切れてしまう…という現象が、対象の環境で発生しました。いろいろ試行錯誤したのですが、結局原因がわからず、急遽別のプロファイラに乗り換えることにしました。もちろん無償で使えるモノ…。

そこで見つけたのがJIPです。結構歴史は古い(2005年SourceForge登録)ようですが、日本語での紹介記事がほとんどなく、意外と知られていないのかな?




http://jiprof.sourceforge.net/


JVM付属の)hprofおよびNetBeans Profilerと比較しつつ、JIPのいいところを3つ挙げてみたいと思います。

JIPの特徴

1. インタラクティブなプロファイリング

計測ON/OFFや除外クラスの変更などを、付属のコマンドを使ってJVMを再起動することなくほぼ一瞬で操作することができます。
hprofだと再起動しない限りON/OFFできませんので、とあるリクエストの処理だけ計測する…ということができずWebサーバ起動までの処理もみんな一緒くたに集計されてしまいます。一方、NetBeansは、ON/OFF可能ですが、除外クラスの変更はキャッシュを作り直しているのか結構時間がかかります。

2. Pure Java

普通のプロファイラは、*.soとか*.dllといった共有ライブラリが付属していますが、JIPはPure Javaです。プラットフォームを選ばずに動作します。それだけでなく、JIPはASMを利用した非常にシンプルな作りになっているため、自分で独自の集計ができるように改良する、なんてこともやりやすいでしょう。

作者による、オレオレプロファイラの作り方を書いた、この記事にエッセンスが詰まっています。

http://www.ibm.com/developerworks/jp/java/library/j-jip/

3. フィルタの充実

プロファイリングでは、計測対象のクラスのフィルタリングが非常に大事です。多すぎると遅くなって計れないし、少なすぎるとボトルネックを絞り込めません。JIPはクラスローダーによるフィルタリングをベースに、クラスのincludeとexcludeを合わせて指定できます。
hprofは何も指定できないので論外。NetBeansは意外にもincludeか、excludeかどちらかしか選べないのです。その点、JIPは柔軟に指定できます。

使い方

JIPをダウンロードして解凍したら(解凍ディレクトリをJIP_HOMEとします)、計測対象のアプリケーションを起動させましょう。Tomcatで動作するWebアプリケーションなら、以下のような環境変数を指定します。

> SET JAVA_OPTS=-javaagent:%JIP_HOME%\profile\profile.jar -Dprofile.properties=%JIP_HOME%\profile\webapp.profile.properties

なお、ここで出てくるwebapp.profiler.propertiesは、Tomcat用に予め用意された設定ファイルで、必要に応じて変更してください。

そうしたら、あとはTomcatを起動するだけです。うまく設定できていれば、Tomcatのログに以下のような出力が含まれるはずです。

・・・
profiler: off
remote: on
port: 15599
thread-depth: compact
・・・

感覚的に普通の起動より5倍以上時間がかかりますので、コーヒーでも入れながら気長にトライしてみてください。これでも、hprofよりはましなはずです。

起動したら、計測したい箇所まで画面遷移させたら、プロファイラをオンにして計測を開始します。

> cd %JIP_HOME%\client
> start.bat localhost 15599

処理が終わったらプロファイラを止めて結果をダンプさせます。

> finish.bat localhost 15599

そうすると、結果のprofile.txtとprofile.xmlが、Tomcatの実行ディレクトリ(大抵の場合CATALINA_HOME)に出力されるはずです。

profile.txtをテキストエディタで見るだけでも十分なのですが、NetBeansに比べると見劣りしてしまいますよね。そういうときは、jipViewerの出番です。引数にprofile.xmlへのパスを指定して下さい。

> cd %JIP_HOME%\tools
> jipViewer.bat path\to\profile.xml

すると、こんな感じでプロファイリング結果が表示されます。

実行時間でソートしたり、呼び出し元をたどったりと、必要十分な感じです。まあ、欲をいうと、値をコピーしてExcelとかに貼り付けられるようになると、もっと便利な気はしますけども。

そんなこんなで、是非使って見てください。