JMX を使ってみた

JMX (Java Management Extensions) は、Java アプリケーション、VM などを監視するための標準 API です。J2SE 5.0 から標準で搭載されています。
JMX という API があるのは知っていましたが、訳あって今回はじめて使ってみました。
これ、便利です!! メモリの使用状況やスレッドの状態をグラフィカルに見ることができます。どうしてもっと早く使わなかったんだろう? まぁ J2SE 5.0 を仕事で使ったのは、前のプロジェクトが初めてですけどね。
まだ 1.4.x を使っている人・組織は、EoD (Ease of Development) とあわせて、5.0 へ早く乗り換えた方がお得だと思います。
# もう次の 6.0 のリリースも目前ですが。

JMX エージェントの有効化

まず、監視されるアプリケーション内の JMX エージェントを有効にします。
Sun JREWebLogic JRockitTomcatWebLogic Server の3通りで試してみました。

Sun JRE の場合

使用する JRE のフォルダ (JDK をインストールしたフォルダの jre) の lib\management\management.properties の以下の箇所を修正します。

# JMX で使用するポート番号 (適宜変更)
com.sun.management.jmxremote.port=8999

# SSL を有効にするか?
com.sun.management.jmxremote.ssl=false
# 認証を有効にするか?
com.sun.management.jmxremote.authenticate=false

※簡単のために、SSL も認証も無効にしてしまいましたが、本番稼動時は適切な設定を行ってください。

以上の設定を行ったら、オプション -Dcom.sun.management.jmxremote を指定して、JRE を起動します。

java -Dcom.sun.management.jmxremote foo.bar.Baz

これで、準備完了です。

JUnit のテスト実行時に使用すれば、早期にメモリリークの発見ができそうです。

WebLogic JRockit の場合

JRockitWebLogic に付属する BEA の JRE です。

オプション -Xmanagement を指定して、JRE を起動します。

java -Xmanagement foo.bar.Baz

監視用のポートはデフォルトで 7091 を使用します。
変更したい場合は、起動オプションで、-Djrockit.managementserver.port=ポート番号 の指定をします。

Tomcat の場合

基本的に使用している JRE の設定に準じます。
ZIP ファイルからインストールしたときは bin\catalina.bat の適切な位置に以下の行を追加します。

set JAVA_OPTIONS=%JAVA_OPTIONS% -Dcom.sun.management.jmxremote

Windows インストーラを使ったときは、Service Manager のプロパティの Java Options に -Dcom.sun.management.jmxremote を追加します。

WebLogic Server の場合

以下、WebLogic がインストールされたフォルダ (C:\BEA\weblogic92 など) を WL_HOME で表します。

1つ目の方法は、起動バッチを修正する方法。
監視用のポートはデフォルトで 7091 を使用します。
%WL_HOME%\samples\domains\wl_server\bin\startWebLogic.cmd の適切な位置に以下の行を追加します。

set JAVA_OPTIONS=%JAVA_OPTIONS% -Xmanagement

2つ目の方法は、管理コンソールから指定する方法。手順は以下の通り。
監視用のポートはデフォルトで 7001 を使用します。

  1. 環境の [サーバ] を選択し、「サーバの概要」画面を開きます。
  2. 監視対象のサーバ(exampleServer など) を選択し、「サーバの設定」画面を開きます。
  3. [プロトコル]、[IIOP] の順にタブを選択します。
  4. チェンジセンタの [ロックして編集] をクリックします。
  5. 「IIOP を有効化」チェックボックスにチェックを入れ、詳細の「デフォルト IIOP ユーザ名」「デフォルト IIOP パスワード」に適当なユーザ名、パスワードを入力します。
    このとき、「ステートフルな認証を使用」のチェックをはずしておかないと上手くいかないことがあるようです。
    ※本来はずすべきでないと思いますが、その場合の対処方法は未調査。
  6. 設定を保存し、WebLogic Server を再起動します。

監視ツール

アプリケーション側の設定ができたら、監視ツールで状況を監視してみましょう。

jconsole

JDK に標準で添付されている監視ツールです。メモリ使用量、スレッドの状況、ロードされたクラス数などが監視できます。

jconsole プロセスID

または、

jconsole ホスト名:ポート番号

で起動します。
単に jconsole で起動して、後から監視対象を指定することも可能です。
IIOP 経由で WebLogic Server を監視する場合は、起動後のダイアログで「詳細」タブを選択し、JMX URL を service:jmx:rmi:///jndi/iiop://localhost:7001/weblogic.management.mbeanservers.runtime
のように指定します。

MC4J Management Console

Apache Lisense 2.0 で公開されているフリーの監視ツールです。
http://sourceforge.net/projects/mc4j/
からダウンロードできます。
メモリ使用量、スレッドの状況などが監視できます。
ダウンロードしたファイルをインストールすると、スタートメニューに登録されます。
監視対象は、起動後の画面で J2SETomcatWebLogic などから選んで、Wizard 形式で追加します。

Sun の JRE に接続した場合、メモリ使用量は、Code Cache、Perm Gen、Eden Space、Survivor Space、Tenured Gen と内訳(?)まで見ることができます。


JRockit Management Console

WebLogic Server に標準で添付されています (JRockit のフォルダの bin\console.exe)。
メモリ使用量、CPU 使用率、メソッド呼び出しなどが監視できます。
console.exe をダブルクリックして起動後、監視対象へ接続します。

他に、Runtime Analyzer、Memory Leak Detector というツールがあって、JRockit のサイトからダウンロードできるようですが、まだ試してみてません。
Sun の JRE に接続しようとしたら固まってしまいました。