Javaトラブルシューティングツール VisualVM

最終更新日:2008/06/24

目次

VisualVMとは?

VisualVMは https://visualvm.dev.java.net/ で公開されている統合トラブルシューティングツールです。

これまではシステム情報やメモリ使用量を確認するには JConsole, アプリケーションのプロファイリングを行うには NetBeans Profiler、といったように目的に応じてツールを使い分ける必要がありました。

VisualVMはそれらの統合プラットフォームのような位置付けになっており、様々な機能をプラグインとして追加できるようになっています(プロファイラはデフォルトで使用可能、JConsoleはプラグインとして追加する形になっています)。

2008/06/12現在の最新版は 1.0 RC です。使ってみた感じではまだ安定しているとは言えないようですが、機能の紹介や感想などを書いて見ようと思います。

VisualVMで何ができるのか?

VisualVMの最大の特徴はプラグインによる拡張ですので、プラグイン次第で色々なことができるようになるはずです。ただ、事情によりプラグインが手元の環境で使えないということもあり、まずはデフォルトの機能だけを挙げてみます。

JConsole や NetBeans Profiler 等の既存ツールをベースに開発されているため、それらとほぼ同等の機能を持っているという印象です。特にNetBeans Profilerをベースにしている部分が多く、一言で言うと「拡張可能な NetBeans Profiler」といったところでしょうか。

NetBeans Profilerとの違いは他の機能をプラグインとして追加可能であるということと、もう一つは導入が簡単ということです。NetBeans Profilerを使うためにはNetBeansをインストールする必要がありましたが、VisualVMならばダウンロードしてexeをダブルクリック(Unix系ならシェルスクリプトを実行)するだけで起動できます。

NetBeans Profilerのすべての機能を使える・・・というわけではないのですが、手軽に使えるということは大きなポイントでしょう。

VisualVMの使い方

準備

VisualVMを動かすにはJDK6.0以降(JRE不可)が必要です。インストールしていなければJDK6.0以降をインストールします。被監視対象のVMは6.0必須ではありませんが、以下の表のようにVisualVMのすべての機能を利用できるのはアプリケーションをJDK6.0以降でローカルマシン上で動作させた場合のみです。

残念ながらリモートで動作するマシンのプロファイリングはできないようです。以降はローカルマシン上でJDK6.0で動作するアプリケーションをモニタリングすることを前提とします。


(https://visualvm.dev.java.net/ Features Matrixより)

ダウンロード

https://visualvm.dev.java.net/ から 1.0 RC の媒体をダウンロードします。

ダウンロード後展開し、適当なディレクトリへ配置して下さい。

起動

Windowsの場合は visualvm/bin/visualvm.exe を、Unix系の場合は visualvm/bin/visualvm を実行します。すると初回はライセンス確認画面の後に、以下のような画面が表示されます。

OK選択してCalibration(測定精度の調整)を完了させます。尚、Calibrationをやり直したい場合は、Windowsの場合はホームディレクトリ(通常C:\Documents and Settings\〜)下の .nbprofiler フォルダ、Unix系の場合はユーザのホームディレクトリ下の .nbprofiler ディレクトリを削除して下さい。次回起動時に再度Calibrationが行われます。

Calibrationが完了すると、以下のようなスタート画面が表示されます。

アプリケーションの起動

今回はTomcatをモニタリングの対象にすることにします。VisualVMが起動した状態でTomcatを起動すると、左のビューにTomcatが自動的に追加されます(起動順序は逆でもOK)。

ここでTomcatアイコンをダブルクリックすると、右側のビューにTomcat用のタブが追加され、その中にOverview, Monitor, Threads, Profilerタブが表示されます。以降これらのタブについて見ていきます。

Overviewタブ

システムの概要を表示するタブです。アプリケーションが動作するVMのバージョンやVM引数、システムプロパティを確認できます。

Monitorタブ

Monitorタブではヒープ領域のサイズ、パーマネント領域のサイズ、ロードされたクラス数、スレッド数を確認できます。

「Perform GC」ボタンでGCを強制実行し、「Heap Dump」ボタンでヒープのダンプを取得できます。Heap Dumpでダンプを取得すると、以下のようにその時点のヒープに格納されているオブジェクトのクラス一覧が表示されます。

ここでクラスをダブルクリックすると、そのクラスのオブジェクト一覧が表示されます。

オブジェクトのフィールド値も参照できるので、テスト環境で不具合が発生した場合に各オブジェクトの現在の値を確認するといった場合に使えそうです(ちなみにこの機能はNetBeans Profilerでも使えます)。

Threadタブ

各スレッドの状態を確認できます。「Thread Dump」ボタンで全スレッドのダンプ(スタックトレース)の表示が可能です。

Profilerタブ

Profilerタブを開くと、以下のように警告メッセージが表示されることがあります。

この警告はVMのクラス共有が有効になっている場合に表示されます。VMクラッシュの可能性があるということですので、プロファイリングを行う場合はクラス共有を無効にするべきでしょう。アプリケーション起動時のオプションに -Xshare:off を加えることでクラス共有が無効になります。

Tomcatの場合はcatalina.batの先頭付近に以下の行を加えればよいでしょう。

set CATALINA_OPTS="-Xshare:off"

「CPU」ボタンでパフォーマンスプロファイリング、「Memory」ボタンでヒープのプロファイリングが行われます。CPUプロファイリングの場合は基本的には以下のようにスナップショットを取得し、

「Hot Spots」タブでホットスポットを確認し、時間がかかっているメソッドの処理に問題が無いか、また右クリックから呼び出しツリーを表示し、無駄な呼び出しが発生していないか等を確認します。

メモリプロファイリングの場合もCPUプロファイリングと同様にスナップショットを取得し、ヒープに存在している割合の多いオブジェクトがどこで生成されたか割り当てツリーを表示して確認する・・・といきたいところですが、VisualVM 1.0 RCでは割り当てツリーの表示ができないようです。NetBeans Profilerならば可能なので、1.0リリース時には実装されているのではないかと思います。

プラグインによる拡張

メニューからTools>Pluginsを選択すると、プラグイン画面が表示されます。

本来ならば恐らく利用可能なプラグインが表示されると思うのですが・・・後述の理由で今回は試すことができなかったため省略します。

VisualVM 1.0 RC の注意点

プロキシ認証

恐らくプロキシ設定はプラグイン画面のSettingsタブにある「Proxy Settings」ボタンで開かれるはずの画面で行うのだと思いますが、1.0 RCでは何も反応がありませんでした。プロキシサーバの情報はシステムのデフォルトブラウザから取得しているようなのですが、プロキシ認証には未対応のようです。

そのためプラグイン機能はプロキシ認証が必要な環境では今のところ利用できません。恐らく1.0リリース時には改善されているのではないかと思います。

NullPointerException

CPUやメモリプロファイリングを行おうとすると、NullPointerExceptionが発生することがありました。ログファイル(WindowsではC:\Documents and Settings\〜\Application Data\.visualvm\release10rc\var\log)を見ると、

Caused by: com.sun.tools.attach.AgentInitializationException:
            Agent JAR loaded but agent failed to initialize
        at sun.tools.attach.HotSpotVirtualMachine.loadAgent(HotSpotVirtualMachine.java:103)

プロファイラエージェントの初期化に失敗しているようです。エージェントのプロセスを再起動すればよいような気がしますが、どれが該当プロセスかわからなかったため、OS再起動したところ発生しなくなりました。

もし同様の現象が出たら試してみてください。

ACCESS_VIOLATION

プロファイリング中にACCESS_VIOLATIONでVMごと落ちることがありました。RCということでまだ安定していないようです。これも今後に期待です。

NetBeans Profilerとの違い

一通り触って見て気が付いた点を挙げてみます。

まずは良い点。

次は気になった点。

NetBeans Profilerよりも若干機能が縮小されているのは、ちょっともったいない気がします。この辺は統合ツールという性質上仕方ないかもしれませんが、できれば同等の機能を実現してほしいところです。

その点を除けば導入のし易さというメリットを活かした有用なツールだと思います。


資料室へ戻る


Copyright (c) 2008 OKI Software Co., Ltd.