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可能ですが、除外クラスの変更はキャッシュを作り直しているのか結構時間がかかります。
使い方
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とかに貼り付けられるようになると、もっと便利な気はしますけども。
そんなこんなで、是非使って見てください。