最近、周りでJavaのプロファイラの話が出たので、そういえば、NetBeans Profilerが優秀だったよなぁと思って、久しぶり(2006年にBlogで書いてました(NetBeans Profiler - Enjoy*Study)ので、その時以来かも…)に自宅のPCにNetBeansをダウンロードして試してみたら、さらにすごく使い勝手がよくなっていてびっくりました。
NetBeans Profiler を使えば、NetBeans IDEで開発したアプリケーション以外でも、とても簡単にプロファイルを始めることができます。
対象のアプリケーションに対して、JVMの設定を変えるような手間もありません。
以降に今回試した際の手順を書いてみます。
下記のサイトから、最新(NetBeans IDE 7.3.1)をダウンロードします。
とりあえず、プロファイラだけ使えればよいので、Java SE版を選びました。
インストーラに従ってインストールし、NetBeans IDEを起動します。
プロファイル対象のアプリケーションで使用するJavaに対して、事前に「プロファイラ調整の実行」を行います。これをしておかないと、そのJVMに対してアタッチできません。
メニューの「プロファイラ」→「拡張コマンド」→「プロファイラの調整の実行」を選択し
対象となるJavaプラットフォームを選択します。
(ここに出ていない場合には、メニューの「ツール」→「Javaプラットフォーム」を選択し、対象のJavaを追加してから再度実施します)
調整が完了すると、プロファイラからアタッチ可能な状態となります。
「プロファイラ」→「プロファイラのアタッチ」を選ぶと、下記のようなウインドウが表示されます。
ここで、プロファイルのタスクを選び、「アタッチ」ボタンを押下して、アタッチするプロセスを選びます。(現在実行中のプロセス一覧から選びます)
これだけで、プロファイルが開始されます。
プロファイル先のアプリケーション(今回はEclipse上で動かしていたTomcat)には、下記のようにプロファイラと接続したことを示すメッセージがコンソールに表示されていました。
下記は、メモリのライブ結果です。当然、GCを実行することもできます。
さらに、メモリの詳細(オブジェクトのツリーなど)を確認したい場合には、いったん、ヒープをダンプします。
ヒープのダンプからは、インスタンスの詳細を確認することができ、どのように参照されているかも確認できます。
CPUタスクからは、CPUの実行時間を計測できます。
高機能で、とっても簡単ですね。(NetBeansが入っていない状態から、メモリのプロファイリングするまで30分もかかりませんでした)
今回は同一PC上で動作しているものに対してプロファイリングを行いましたが、リモートで行う機能もあるので、そちらも試してみたいと思いました。