Javaデバッグツール
最終更新日:2008/02/25
- jvmstat
JavaVMのパフォーマンス統計データ監視ツール
- gcPortal
JavaVMのGC解析ツール
- jconsole
J2SE5.0付属のJMXに準拠した監視ツール
- jstat
J2SE5.0付属のパフォーマンス統計データ監視ツール
- NetBeans Profiler
NetBeansに付属するパフォーマンス, ヒープメモリのプロファイラ
概要
Java ランタイムのパフォーマンス情報(主にGC関連)をリアルタイムにモニタリングできるツール。附属のvisualgcツールでは、動作中のJavaVM
のヒープメモリの状況をグラフィカルに表示することができます。付属のperfagentツールにより、リモートホストで動作するJavaVMの状況監視も可能。ただし、監視対象VMがJ2SE1.4.1以降(with
HotSpot)である必要があります。
準備
- jvmstatのダウンロード
http://developers.sun.com/dev/coolstuff/jvmstat/ からバイナリをダウンロードする。監視対象のJ2SEのバージョンが1.4.2ならば2.0を、1.4.1以前ならば1.1をダウンロードする(ユーザ登録が必要です)。筆者は2.0をダウンロードしました。
インストール
- ファイルの展開
ダウンロードしたファイルを展開し、任意のフォルダへ配置します。パスに2バイト文字や空白を含めないほうが良いでしょう。ここではc:/jvmstatへインストールしたとします。尚、以降このフォルダをJVMSTAT_HOMEとします。
- ポリシーファイルの配置
ポリシーファイルをJVMSTAT_HOME/policiesへコピーします。リモートホストの監視をRMIで行うために、ポリシーファイルが必要になります。jvmstatではこのポリシーファイルを作成するツール(configurepolicy)が用意されていますが、簡単のためすべてを許すポリシーを使うことにします(実運用でこのポリシーを使用するのは避けてください)。
実行
ローカルホストで動作するAPを監視する場合
- 監視対象APを起動する
- jvmpsツールを実行し、監視対象APのプロセスIDを調べる
ツールの起動方法は以下の通り。
% cd JVMSTAT_HOME/bat
% jvmps
以下はJ2SE付属のJava2Dデモを監視対象APとして起動した場合のjvmpsコマンドの出力結果です(3040が監視対象APのプロセスID)。
1604 jvmps.jar
3040 Java2Demo.jar
- (テキストベースでモニタリングする場合)以下のコマンドを実行する
% cd JVMSTAT_HOME/bat
% jvmstat -gcutil 3040 1000
3040は前述のプロセスID、1000は解析の間隔(ミリ秒)です。-gcutilは解析項目のオプション指定の一つで、GCの簡潔な要約を出力するためのものです。その他に詳細項目を出力するオプションもあります。詳しくはツールのドキュメントを参照して下さい。出力結果(の一部)は以下のものです。
S0 S1 E O P YGC YGCT FGC FGCT GCT
39.01 0.00 86.84 68.87 99.00 34 0.107 8 0.495 0.602
0.00 37.94 77.99 68.87 99.00 35 0.108 8 0.495 0.603
38.01 0.00 67.67 68.87 99.00 36 0.108 8 0.495 0.603
0.00 37.94 61.78 68.87 99.00 37 0.109 8 0.495 0.604
38.01 0.00 57.26 68.87 99.00 38 0.109 8 0.495 0.605
0.00 38.06 52.15 68.87 99.01 39 0.110 8 0.495 0.605
38.01 0.00 48.59 68.87 99.01 40 0.111 8 0.495 0.606
0.00 38.01 41.02 68.87 99.02 41 0.111 8 0.495 0.606
37.94 0.00 30.77 68.87 99.02 42 0.112 8 0.495 0.607
0.00 38.01 25.67 68.87 99.02 43 0.112 8 0.495 0.608
37.94 0.00 20.05 68.87 99.02 44 0.113 8 0.495 0.608
- (ビジュアルモデリングする場合)以下のコマンドを実行する
% cd JVMSTAT_HOME/bat
% visual 3040 1000
3つのウィンドウが開かれ、主にGCに関する項目が表示されます。


各項目の説明はjvmstatのドキュメント、または関連サイトのリンクを参考にして下さい。
リモートホストで動作するAPを監視する場合
ここでは監視対象APの動作するホストをホストA、監視する側のホストをホストBとします。尚、jvmstatは両ホストへインストールする必要があります。
- ホストAで監視対象APを起動する
- ホストAで以下のコマンドを実行し、エージェント(perfagentツール)を動作させる
% cd JVMSTAT_HOME/bat
% perfagent
- ホストBで以下のコマンドを実行し、ホストAで動作する監視対象APのプロセスIDを調べる
% cd JVMSTAT_HOME/bat
% jvmps -l ホストA
- ホストBでjvmstat or visualgcを実行する
以下はjvmstatの実行例です。visualgcも同様に実行して下さい。
% cd JVMSTAT_HOME/bat
% jvmstat -gcutil 3040@ホストA 1000
参考サイト
概要
javaの起動オプションの-verbose:gcで出力されるGCログを元にGCの解析を行い、その結果をグラフィカルに表示するWebアプリケーションです。jvmstatがリアルタイムにJVMの状況を監視するツールであるのに対し、こちらはあらかじめ取得したGCログを解析するためのツールです。
尚、このツールはPure Javaでは無いため、動作するプラットフォームが限られます。執筆時点ではWindows版とSolaris版がダウンロード可能です。以下ではWindows版を使用することを前提とします。
インストール
- GC PortalのサイトからWindows向け媒体(gcPortal_win_Tomcat.zip)をダウンロードし、展開する
- Tomcat4.0.xをインストールする。
gcPortalはWebベースのツールであるため、動作させるにはサーブレット・コンテナが必要です。ここではTomcatを利用します(上記媒体名に名前が付いているようにTomcat以外では動作しないかもしれません)。ただし、Tomcat4.1.xでは動作しません。これは、http://www.jajakarta.org/kvasir/bbs/old/233?msg=2#msg702の問題と同じで、パッケージが無いクラスをJSPから参照していることが原因です。ソースの修正を行えばTomcat4.1.xでも動作するかもしれません。尚、執筆時点ではjakartaのサイトからTomcatの古い版をダウンロードできないようです。そのため、雑誌の付属CD-ROM等から入手する必要があります。尚、Tomcatのインストール方法は割愛します。
- ここからawkのバイナリをダウンロードし、インストールする
- ここからActive Perlをダウンロードし、インストールする
- 1で展開したフォルダに含まれるgcPortal.warをTomcatのインストールディレクトリ(以後CATALINA_HOME)/webappsへコピーし、Tomcatを起動する→warファイルが展開される。
- ここからKavaChart 4.0.1 server beans in zip formatをダウンロードし、展開してできるフォルダ下のjsp/kavachart.warを以下のコマンドで展開し、
% jar xvf kavachart.war
展開してできるフォルダ(WEB-INF)内のlib/kcServlet.jarを、CATALINA_HOME/webapps/gcPortal/WEB-INF/libへコピーする。
- JDBC接続可能なDBを用意する。
このツールはログインユーザや解析結果をDBで管理するため、DBも用意する必要があります。筆者はHSQLDBを使用しました。
- 1で展開したフォルダに含まれるsqlTables.sqlを実行し、テーブルを生成する。sqlTables.sql内のSQLはOracleベースであるため、DBの種類に応じて変更する必要があります。
- CATALINA_HOME/webapps/gcPortal/signin.htmlの<head>タグ内に以下のJavaScriptを追加する。
<SCRIPT language="JavaScript">
<!--
function HandleEnter(event) {
// do nothing
}
//-->
</SCRIPT>
signin.htmlではこの関数の定義がないため、テキストフィールドに入力するたびにエラーメッセージが出ます。この対策として関数を空定義します。
GCログの取得
gcPortalでの解析のインプットとするGCログを取得します。gcPortalは以下のオプションで出力される情報を元に解析を行うため、このオプションを付けて測定対象Javaプログラムを実行する必要があります。
- -verbose:gc
- -XX:+PrintGCTimeStamps
- -XX:+PrintGCDetails
ログ取得の例
% java -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails ターゲットクラス > gc.log
実行
Tomcatを起動しhttp://マシン名:ポート番号/gcPortal/へアクセスすると、以下の画面が表示されます。

まだユーザが登録されていないので、"New User? Sign in Here"リンクをクリックしてユーザ登録画面へ進みます(以下)。

すべての項目を入力し、Submitボタンを押下します。成功すると以下の画面が表示されます。

Loginボタンを押下してログイン画面へ戻り、登録したアカウントでログインします。使用許諾画面表示の後、以下の画面が表示されます(この操作や以降の操作でJavaScriptのエラーダイアログが表示される場合がありますが、とりあえず無視します)。

ここで画面左の「Load a New File」をクリックすると、プロジェクトの選択画面が表示されます。最初はプロジェクトが何も無い状態なのでプロジェクトを作成し、そのプロジェクトを選択します。以下のファイル選択画面が表示されるので、

-verbose:gcオプションで出力されたGCログファイルを選択し、「Load File」を押下し次に表示される画面で「Analyse
Data」を押下するとGCログの解析結果が表示されます(以下)。

以下のフォーム(上と同じ画面)で世代別のGCの様子を詳細に表示するためのフォームがあります。

例えばYoung Generation GC Cycleで「View」ボタンを押下すると、そのGCの様子が以下のように表示されます。

GCによってメモリ量がどのように変化しているかがわかります。これをグラフ表示することも可能で、同一画面内の「View Graph」ボタンの左で表示させたいグラフ種別(複数選択可。その場合選んだすべてが表示される。)を選択し、ボタンを押下すると以下のようにグラフで表示されます。赤いピボットのある線がGC前、青いピボットのほうがGC後を表しています。

概要
jconsoleはJ2SE5.0に付属するJMX準拠の監視ツールです。ローカルやリモートで実行されるJavaアプリケーションのパフォーマンスとリソース状況を監視することができます。
J2SE1.4でも、上で紹介したjvmstatやpurify等の商用ツールによってパフォーマンスチェックやリソース使用状況の監視が可能ですが、jconsoleはJ2SE5.0にデフォルトで付属しているという点がポイントです。
準備
jconsoleはJ2SE5.0に付属しているので、もちろんJ2SE5.0が必要です。また、監視対象アプリケーションのJava環境と監視する側のJava環境が共にJ2SE5.0でなければなりません。
残念ながらJ2SE1.4で動作しているアプリケーションをjconsoleで監視することはできません。
インストール
J2SE5.0を監視対象アプリケーションの動作する環境と、監視する側の環境にインストールします。
実行
ローカルホストで動作するアプリケーションを監視する場合
- 監視対象アプリケーションを以下のように起動する
% java -Dcom.sun.management.jmxremote アプリケーションのクラス名
- jconsoleを起動する。起動方法は以下のようにコマンドプロンプトからjconsoleコマンドを叩くだけです。
% jconsole
するとダイアログがが表示されます。以下はJ2SE付属のSwingSet2.jarを監視対象アプリケーションとして起動していた場合の例です。

また、監視対象アプリケーションのプロセスIDを指定して起動する場合は、事前にjpsコマンドでプロセスIDを確認し、jconsoleの引数として渡します。
% jps
% jconsole プロセスID
- 監視対象アプリケーションへの接続
上の画面で監視したいアプリケーション(この場合PID=604のアプリケーション)を選択し、「接続」ボタンを押すと以下のように複数のタブを持つ画面が表示されます。

この「概要」タブではスレッド、メモリ等の概要情報が表示されます。概要といっても、JITコンパイルの総時間のように非常に細かな情報も表示されています。
以下は「メモリ」タブの表示です。

ヒープ/ノンヒープの総メモリ量や、Eden, Suvivor, Tenuredといった世代別GCで使用される各領域についてのメモリ量の変化をグラフで見ることができます。右上のGCボタンによって任意のタイミングでGCを発生させることも可能です。
これだけの機能が標準で付いているというだけでもJ2SE5.0を採用する価値があるのではないでしょうか?ただし、このグラフからは「メモリリークを起こしているかどうか」はわかりますが、「メモリリークの原因」についてはわかりません。商用その他のツールのようにオブジェクトの差分抽出機能がないためです。メモリリークの治療にはやはり外部ツールを活用していく必要があるようです。
以下は「スレッド」タブの表示です。

現在生きているスレッドの一覧や最大スレッド数などが表示されます。スレッドでデッドロックが発生した場合の常套手段として、スレッドダンプの表示がありますが、そのためには(Windowsならば)コマンドプロンプトからCtrl + breakを入力する必要があります。
しかしコマンドプロンプトを表示しないようなシステムではこの手が使えない場合もあるでしょう。そんな時にもjconsoleならリストから該当スレッドを選択するだけでどこで止まっているかを特定できます(スタックトレースが表示されます)。
以下は「クラス」タブの表示です。ロードされたクラスの総数を見ることができます。

以下は「MBeans」タブの表示です。登録されているMBeanの情報を見ることができます。

最後は「VM」タグです。その名の通りVMの情報が詳細に表示されます。
リモートで動作するアプリケーションを監視する場合
jconsoleはリモートで動作するアプリケーションの監視も可能です。そのため、監視対象アプリケーションが動作するマシンに何かツールをインストールする必要はありませんし、またリモート監視を行うことで、監視対象アプリケーションが動作するマシンへの負荷をなるべく欠けずに測定を行うことができます。
- 監視対象アプリケーションを以下のように起動する
% java -Dcom.sun.management.jmxremote.port=ポート番号
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false アプリケーションのクラス名
(実際は1行で入力します)
リモート監視ではjconsoleから接続する際にポート番号の指定が必要になるため、上記のようにポート番号を指定します。また、デフォルトでSSLとパスワード認証が有効になっているため、これを無効にします。
- jconsoleを起動し、表示されるダイアログで「リモート」タブを選択
- 監視対象アプリケーションが動作しているマシン名と上で設定したポート番号を入力し、「接続」ボタンを押下する
リモート監視を行うにあたって、
- 監視対象アプリケーションの動作するマシンへ何もインストールしなくて良い
- jconsole自体がリモートで動作するのでアプリケーションにそれほど負荷がかからない
という点が大きいと思います。ただし前述のように、メモリリーク箇所の特定やパフォーマンスボトルネックの特定といった機能はありません。
またモニタリングした情報を保存する機能はありません。もしメモリ使用状況やGCに関する情報をログに残すには次のjstatを使用します。
参考
概要
jstatはJ2SE5.0に付属するパフォーマンス統計データ監視ツールです。元々外部ツールとしてjvmstatがありましたが、名称をjstatに変更してJ2SE5.0に組み込まれました。jvmstatで紹介した他のツールも以下のように名称が変わってJ2SE5.0に組み込まれています。
| jvmstatツールでの名称 |
J2SE5.0での名称 |
| jvmstat |
jstat |
| jvmps |
jps |
| perfagent |
jstatd |
| visualgc |
(対応無し) |
visualgcはJ2SE5.0に含まれていませんので、visualgcが使いたい場合はここから別途jvmstat一式をダウンロードする必要があります。
実行
ローカルホストで動作するアプリケーションを監視する場合
- 監視対象アプリケーションを以下のように起動する
- jpsツールを実行し、監視対象APのプロセスIDを調べる
- 以下のようにjstatコマンドを実行する
% jstat -gcutil プロセスID 監視間隔(単位:ミリ秒)
使用可能なオプションはjvmstatツールと似ています。詳細はSUNのオンラインドキュメントを参照して下さい。
リモートで動作するアプリケーションを監視する場合
監視対象APの動作するホストをホストA、監視する側のホストをホストBとします。尚、両ホストにJ2SE5.0がインストールされているとします。
- ホストAで監視対象APを起動する
- ポリシーファイルの準備
ホストAでポリシーファイルを作成します。ポリシーファイルの作成についてはjvmstatのインストールの項目を参照して下さい。
- ホストAで以下のコマンドを実行し、jstatのデーモンを起動する(カレントディレクトリにpolicy.allが存在するとします)
% jstatd -J-Djava.security.policy=policy.all
- ホストBで以下のコマンドを実行し、ホストAで動作する監視対象APのプロセスIDを調べる
% jps -l ホストA
- ホストBでjstatを実行する
% jstat -gcutil プロセスID@ホストA 監視間隔(単位:ミリ秒)
参考
資料室へ戻る
Copyright (c) 2004 Oki Software Co., Ltd.