ナビゲーションをスキップ

Java アプリケーションの開発

  前 次 前/次ボタンと目次ボタンとの区切り線 目次  

BEA JRockit でのプロファイリングとデバッグ

BEA JRockit JDK には JVM のプロファイリング インタフェース (JVMPI) と デバッグ インタフェース (JVMDI) が含まれており、Java アプリケーションはこれらのインタフェースを介して JVM と対話し、プロファイリング アクティビティとデバッグ アクティビティを支援します。開発者はこれらのインタフェースをアプリケーション コードに実装する必要がありますが、ユーザ側では通常、実行するアプリケーションで選択したプロファイリング ツールとデバッグ ツールを通じて、JVMPI や JVMDI に接することになります。

この節の内容は以下のとおりです。

 


BEA JRockit のプロファイリング

さまざまなサードパーティのプロファイリング ツールを使用して、BEA JRockit のパフォーマンスをプロファイリングできます。この節では、それらのツールを使いやすくするために、Java Virtual Machine Profiler Interface (JVMPI) を使用する方法について説明します。

JVMPI の使用

JVMPI を利用すると、BEA JRockit JDK でサードパーティのプロファイリング ツールを使用できます。

警告 : このインタフェースは Java 2 JDK の実験的な機能であり、まだ標準のプロファイリング インタフェースではありません。

JVMPI の仕組み

JVMPI は、Java 仮想マシンとインプロセスのプロファイラ エージェントとの間の、双方向の関数呼び出しインタフェースです。仮想マシンは、ヒープの割り当てやスレッドの開始などに対応するさまざまなイベントを、プロファイラ エージェントに通知します。同時に、プロファイラ エージェントは、JVMPI を介して詳細に関する制御と要求を発行します。たとえば、プロファイラ エージェントは、プロファイラ フロントエンドの要求に基づいて、特定のイベント通知を有効または無効にすることができます。

プロファイラ フロントエンドは、必ずしもプロファイラ エージェントと同じプロセスで動作する必要はありません。同じマシン上の別のプロセスや、ネットワークを介して接続されたリモート マシン上のプロセスに置くこともできます。JVMPI では標準の通信プロトコルを指定していません。ツール ベンダはさまざまなプロファイラ フロントエンドの必要性に適した通信プロトコルを設計できます。

JVMPI に基づいたプロファイリング ツールを使用すると、多量のメモリが割り当てられている場所、CPU 使用率のホットスポット、不要なオブジェクトの保持、モニタの競合など、パフォーマンスの包括的な分析に役立つさまざまな情報を取得できます。

JVMPI によって、部分的なプロファイリングもサポートされています。ユーザは、VM が動作する特定の期間を指定してアプリケーションのプロファイリングを行ったり、特定の種類のプロファイリング情報を選んで取得したりできます。

注意 : JVMPI は 1 つの VM につき 1 つのエージェントだけをサポートします。

JVMPI のデフォルト動作の変更

JVMPI のデフォルトの動作を変更するには、以下のオプションを使用します。

-Xjvmpi [:<argument1>=<value1>[,<argumentN>=<valueN>]]

BEA JRockit にプロファイリング エージェントを追加して実行する場合、デフォルトでは多数のイベントが有効になっており、オーバーヘッドが高くなる可能性があります。JVMPI ではこれらのイベントをすべて送信する必要はないため、-Xjvmpi フラグを設定してイベントを無効にすることができます。表 4-1 に示す引数を使用して、デフォルトの動作を変更します。

表 4-1 -Xjvmpi のコマンドライン引数

引数

説明

entryexit=off|on (デフォルトは on)

この引数を off に設定すると、JVMPI によって送信される以下のメソッド エントリ イベントと終了イベントが無効になります。

  • JVMPI_EVENT_METHOD_ENTRY

  • JVMPI_EVENT_METHOD_ENTRY2

  • JVMPI_EVENT_METHOD_EXIT

allocs=off|on (デフォルトは on)

この引数を off に設定すると、以下のオブジェクト割り当てイベントとオブジェクト解放イベントが無効になります。

  • JVMPI_EVENT_OBJECT_ALLOC
  • JVMPI_EVENT_OBJECT_MOVE
  • JVMPI_EVENT_OBJECT_FREE
  • JVMPI_EVENT_ARENA_NEW
  • JVMPI_EVENT_ARENA_DELETE

monitors=off|on (デフォルトは on)

この引数を off に設定すると、以下のモニタ競合イベントが無効になります。

  • JVMPI_EVENT_RAW_MONITOR_CONTENDED_ENTER
  • JVMPI_EVENT_RAW_MONITOR_CONTENDED_ENTERED
  • JVMPI_EVENT_RAW_MONITOR_CONTENDED_EXIT
  • JVMPI_EVENT_MONITOR_CONTENDED_ENTER
  • JVMPI_EVENT_MONITOR_CONTENDED_ENTERED
  • JVMPI_EVENT_MONITOR_CONTENDED_EXIT
  • JVMPI_EVENT_MONITOR_WAIT
  • JVMPI_EVENT_MONITOR_WAITED

arenadelete=off|on (デフォルトは off)

この引数を on に設定すると、JVMPI_EVENT_ARENA_DELETE イベントが無効になります。このイベントを送信しない Sun VM との互換性を保つために、デフォルトでは off になっています。プロファイラにこのイベントを受信させる場合は、イベントを有効にできます。

JVMPI のその他のドキュメント

JVMPI は実験的なインタフェースですが、Sun Microsystems では、Java VM でプロファイリング用フックをすぐに必要としているツール ベンダのためにドキュメントを提供しています。このドキュメントは以下で入手できます。

http://java.sun.com/j2se/1.5.0/docs/guide/jvmpi/index.html

HPROF プロファイリング エージェントによるプロファイリング

JVMPI の補助的なコンポーネントとして、Java 2 JDK に付属している HPROF プロファイリング エージェントがあります。HPROF は、JVMPI と対話してプロファイリング情報をファイルまたはソケットに書き込む、動的にリンクされたライブラリです。プロファイラ フロントエンド ツールを使用してその情報を処理することができます。

HPROF は CPU 使用率、ヒープ割り当ての統計、モニタ競合プロファイルなどの情報を表示します。詳細なヒープ ダンプや BEA JRockit のすべてのモニタとスレッドの状態も報告できます。

HPROF を実行するには、起動時に -Xrunhprof コマンドを使用します。次に例を示します。

java -Xrunhprof ClassToProfile

要求されたプロファイリングのタイプに応じて、HPROF は関連する JVMPI イベントを送信するように仮想マシンに指示し、そのイベント データをプロファイリング情報に処理します。たとえば、以下のコマンドではヒープ割り当てのプロファイルを取得します。

java -Xrunhprof:heap=sites ToBeProfiledClass

HPROF のドキュメント

HPROF は J2SE JDK の一部として配布されています。この機能の詳しいドキュメントは以下にあります。

http://java.sun.com/j2se/1.5.0/docs/guide/jvmpi/jvmpi.html#hprof

 


BEA JRockit でのデバッグ

この節では、デバッグ ツールが BEA JRockit とやり取りして Java アプリケーションをデバッグできるようにするためのインタフェースについて説明します。

Java Virtual Machine Debugger Interface (JVMDI)

JVMDI は、デバッガや他のプログラミング ツールで使用される低レベルのデバッグ インタフェースです。JVMDI を使用すると、BEA JRockit JVM で動作しているアプリケーションの状態を調べて、実行を制御できます。

JVMDI では、JVM 内で動作する Java アプリケーションをデバッグできるように JVM が提供する機能について記述されています。JVMDI では、JVM がデバッグのために提供する必要のあるサービスを定義しています。JVMDI のサービスには、(現在のスタック フレームなどの) 情報の要求、(ブレークポイントの設定などの) アクション、(ブレークポイントに到達した時点での) 通知があります。

JVMDI の仕組み

JVMDI は双方向のインタフェースです。

JVMDI クライアントはデバッグ対象のアプリケーションと同じ VM 内で動作し、ネイティブ インタフェースを介して JVMDI にアクセスします。ネイティブのインプロセス インタフェースを使用すると、デバッグ ツールによる最小限の命令で最大限に制御することができます。通常、JVMDI クライアントは比較的小さいサイズです。JVMDI クライアントは、デバッガの機能を実装する独立したプロセスによって、対象アプリケーションの通常の実行を妨げることなく制御されます。

JVMDI のドキュメント

Sun Microsystems は、Java Platform Debugger Architecture および JVMDI に関する詳細なリファレンスのドキュメントを提供しています。詳細については、以下を参照してください。

http://java.sun.com/j2se/1.4.1/docs/guide/jpda/index.html

 

ナビゲーション バーをスキップ  ページの先頭 前 次