6. 管理、診断機能
2006.02.23 株式会社四次元データ 鈴木 圭
- 6.1. OutOfMemoryError の詳細情報
- 6.2. コマンドライン・ツール
- 6.3. JMX(Java Management Extensions)
- 6.4. デバッガ・アーキテクチャの改善
Mustang の管理、診断機能について解説を行います。OutOfMemoryError の詳細情報が取得可能になったことや、各種デバッグ機能の利便性の向上などが行われています。
6.1. OutOfMemoryError の詳細情報
Mustang では OutOfMemoryError に関する詳細情報を取得することができるようになりました。一番分かりやすい例として、以下のような OutOfMemoryError の発生するコードを含むプログラム(OutOfMemoryErrorMain.java)を実行するとします:
// OutOfMemoryErrorMain.java
public class OutOfMemoryErrorMain
{
    public static void main(String[] arguments)
    {
        List<byte[]> list = new ArrayList<byte[]>();
        for(;;) {
            // ガベージ・コレクトされないようにリストに入れていく.
            list.add(new byte[1024*1024]);
        }
    }
}
これを Tiger で実行し OutOfMemoryError が発生すると、以下のような出力が行われますが、どの位置で OutOfMemoryError が発生したのか判別することはできません:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
一方、Mustang で実行した場合は、OutOfMemoryError が発生した場所も出力されます:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at com.example.mustang.OutOfMemoryErrorMain.main(OutOfMemoryErrorMain.java:14)
6.2. コマンドライン・ツール
今まで Linux 版しか提供されていなかったもののうち、いくつかは Windows 版も提供されるようになりました。jconsole に関しては今まで試験的とされていましたが、Mustang では標準の(試験的ではない)ツールとして提供されるようになりました。また、ヒープ・ダンプの内容をブラウザで閲覧するための jhat が新しく追加されました。以下に管理機能に関するコマンドライン・ツールの対応状況を示します:
| 名称 | Windows 版 | Linux 版 | 試験的 | 
|---|---|---|---|
| jconsole | Yes | Yes | No | 
| jinfo | Yes | Yes | Yes | 
| jhat | Yes | Yes | Yes | 
| jmap | Yes | Yes | Yes | 
| jstack | Yes | Yes | Yes | 
■ 試験的→標準となったツール
   ■ Windows 版も提供されるようになったツール
   ■ 新しく提供されるようになったツール
jps
他のツールの説明の前に jps というツールの説明をします。jps は JVM で実行されてているプロセスの一覧を出力するツールです。以前から存在するものですが、jps を使用することによって JVM で実行されているプロセスの識別子(数値)を得ることができます。他のツールのいくつかは、jps で得られるプロセスの識別氏を必要とするものがあります。以下のように引数を指定せずに jps を実行すると、ローカルの JVM で実行されているプロセスの一覧を出力します:
jps
実行結果として以下のような出力が得られます(そのとき実行している Java プロセスによって変わります)。出力の各行には、プロセスを識別する数値と、その名前が含まれます:
2092 TrayIconMain 3380 Jps 2780 startup.jar 1224 SimpleHttpServerMain
jconsole
jconsole は JVM の監視を行うためのグラフィカル・ツールです。Tiger では -Dcom.sun.management.jmxremote オプションを付けて起動されたアプリケーションしか監視することができませんでしたが、Mustang では dynamic attach API がデフォルトでサポートされたことにより、-Dcom.sun.management.jmxremote オプションを付けずに起動されたアプリケーションの監視も行うことができるようになりました。
jconsole を引数を指定せずに起動すると、接続先を指定するダイアログが表示されますので、ここで接続先を指定します。-help オプションを指定して起動すると、指定可能なオプションなどを知ることができます。接続が完了すると以下のようなウィンドウが表示され、詳細な情報を得ることができます:

jinfo
jinfo は Java の構成情報(システム・プロパティや JVM のコマンドライン・フラグ)を出力するツールです。Windows 版では -flag というオプションだけがサポートされています。
jinfo -flag NewSize 2345
jhat
ヒープ・ダンプの内容をブラウザで閲覧するためのツールです。jmap で作成したダンプ・ファイルの内容を閲覧するために使用します。例えば、heap.dump というファイルの内容を閲覧するには以下のコマンドを実行します:
jhat heap.dump
jhat を起動後、ブラウザで http://localhost:7000/ にアクセスすることで、内容を閲覧することができます。待ち受けポートなどは jhat の起動オプションで変更可能です。
jmap
共有オブジェクトのメモリ・マップやヒープ・メモリの詳細などを表示するためのツールです。Windows 版では「jmap -histo pid」または「jmap -dump:<dump-options> pid」という形式のみサポートされています。例えば、プロセス ID 488 のヒープ・メモリをバイナリ形式で heap.dump というファイルに出力するには、以下のコマンドを実行します:
jmap -dump:format=b,file=heap.dump 448
jstack
jstack は Java スレッドのスタック・トレースを表示するためのツールです。jstack のオプションはいくつか定義されていますが、Windows では「jstack pid」という形式のみサポートされています。例えばプロセス ID 777 のプロセスのスタック・トレースを得るには以下のコマンドを実行します:
jstack 777
6.3. JMX(Java Management Extensions)
J2SE 5.0 で Java プラットフォームの一部となった JMX ですが、Mustang では主に以下の変更が行われました:
- Generics の完全対応
 - JMX の API が Generics に完全対応しました。
- カスタム MXBeans
 - 今まではデフォルトで提供されてる MXBean しか使うことができませんでしたが、Mustang ではユーザ定義の MXBean を作成することが可能となりました。また、このために MXBean アノテーションも追加されました。
- MBean 記述子
 - MBean 記述子は MBean に関する付加情報を提供するためのものです。以前は Model MBean に対してだけ作成することができましたが、Mustang ではどのタイプの MBean に対しても MBean 記述子を作成することができるようになりました。また、これに関して DescriptorKey アノテーションが追加されました。
- JMX クラスの追加
 - 定数や static メソッドを持つ JMX クラスが追加されました。
- Monitor API の改善
 - 以前は単純型の属性しかサポートされませんでしたが、複雑型の属性もサポートされるようになりました。
- ObjectName にワイルドカード
 - MBean のオブジェクト名またはオブジェクト名のパターンを表す javax.management.ObjectName クラスで、ワイルドカードを使用することが可能となりました。
6.4. デバッガ・アーキテクチャの改善
Java では JVM 上で実行されるアプリケーションの状態取得などを行うためのインタフェースが提供されています。デバッガや jconsole のようなツールを作成するときに使用します。デバッガ・アーキテクチャは以前から提供されていましたが、Mustang では以下のような構成になっています:
- JPDA(Java Platform Debugger Architecture)
 - Java プラットフォームのデバッガのためのアーキテクチャです。JVM TI、JDWP、JDI によって構成されます。
- JVM TI(Java Virtual Machine Tool Interface)
 - JPDA の下位レベルのインタフェースを提供します。JVM 上で実行されるアプリケーションの状態調査や実行制御を行うためのネイティブ・インタフェースです。
- JDWP(Java Debug Wire Protocol)
 - デバッガと JVM の間でやり取りされるプロトコルです。
- JDI(Java Debug Interface)
 - JDPA の上位レベルのインタフェースを提供します。JVM TI とは異なり Java の API として提供されます。
JMVPI と JVMDI の廃止
以前からの大きな変更点として、非推奨だった JMVPI(Java Virtual Machine Profiler Interface)と JVMDI(Java Virtual Machie Debug Interface)は削除されました。これらの機能は JVM TI によってリプレイスされました。
JDI の変更点
JPDA の上位レベルインタフェースである JDI には以下の変更が行われました:
- ヒープ参照の改良
 - 全てのインスタンスを返す ReferenceType#instances メソッド、ReferenceType#instances がサポートされているかどうか判別する VirtualMachine#canGetInstanceInfo メソッド、オブジェクトを参照しているオブジェクトを返す ObjectReference#referringObjects メソッドなどが新しく追加されました。
- ClassType の定数プールへのアクセスが可能
 - 定数プールにアクセスするためのメソッド ReferenceType#constantPool が新しく追加されました。
- 生成されたイベントのフィルタ
 - 生成されたイベントにフィルタをかける ClassPrepareRequest#addSourceFileFilter メソッドが追加されました。
- デバッグ属性が指定されなくても引数にアクセス可能
 - javac を実行するときに -g オプションを指定するとデバッグ情報が生成されますが、-g オプションを指定せずにコンパイルされたプログラムに対しても、メソッドの引数にアクセスすることが可能になりました。
- Method Exit イベント
 - Method Exit イベント発生時にメソッドの戻り値を取得可能になりました。
- メソッドからの早期復帰
 - メソッドの途中で強制的に復帰させるための ThreadReference#forceEarlyReturn メソッドが追加されました。
- モニタの獲得と開放のためのブレークポイント要求
 - 特定のスレッドがモニタを獲得したとき、特定のスレッドが特定のモニタを獲得/開放したとき、スレッドが特定のモニタを獲得/開放したとき、ブレークポイントを設定することができるようになりました。
- モニタが獲得された場所を得る
 - ThreadReference#ownedMonitorsAndFrames メソッドが追加されたほか、MonitorInfo インタフェースも新しく追加されました。
- JPDA がリスンしているポートを探し出すよりよい方法
 - 新しいコネクタ com.sun.tools.jdi.ProcessAttach が追加されました。
JVM TI の変更点
JVM TI はデバッガのためのネイティブ・インタフェースです。より低レベルな操作が必要なツールの作成に使用します。Mustang における JVM TI の主な変更点は以下のとおりです:
- クラスファイルの変換のサポート
 - ロード済みクラスの動的変換を容易にする RetransformClasses 関数が新しく追加されました。
- ヒープ探索の改良
 - プリミティブ値(String/配列/プリミティブ・フィールド)へのアクセスや、参照タグの設定によるより有効な局所化された参照フラグの構築などが可能になりました。
- さらなるクラス情報
 - GetConstantPool、GetClassVersionNumbers、IsModifiableClass 関数が新しく追加されました。
- ネイティブ・メソッドの測定のサポート
 - SetNativeMethodPrefix と SetNativeMethodPrefixes 関数が新しく追加されました。
- システム・クラス・ローダー下における測定サポートの改良
 - AddToSystemClassLoaderSearch 関数が新しく追加されました。
- メソッドからの早い復帰をサポート
 - 強制的にメソッドから早期復帰する機能が追加されました。
- モニタ・スタックの深さ情報
 - GetOwnedMonitorStackDepthInfo 関数が新しく追加されました。
- リソース枯渇の通知
 - ヒープのようなクリティカル・リソースの枯渇を通知するイベント ResourceExhausted が新しく追加されました。
まとめ
Java にはたくさんの周辺ツールが存在しますが、JDK 本体にもデバッグや監視のためのツールが付属しています。JPDA などは一般のプログラマはあまり使わない機能ですが、今回解説したようなアーキテクチャの整理(JVMDI、JVMPI の削除)や機能強化が行われました。
次回は国際化に関する機能を解説します。和暦ロケールのサポートなど基本機能の強化や、Unicode 正規化のサポートなどが行われています。

![Webアプリ開発エンジニアのための技術情報サイト[テックスコア]](/common/img/description.gif) 
 







