|
特長
HPjmeterは、プラットフォームに依存しないツールです。HPjmeterを使用すると、プロファイリング データをグラフィカル表示して、パフォーマンスのボトルネックを検出することができます。HPjmeterは、すべてのサポートされるプロファイリング オプションにより収集したデータから、可能なメトリクスを抽出します。ただし、HPjmeterの実際の機能は、Java VM のバージョン、オペレーティングシステム、プロファイリングに使用されたプロファイリング オプションに依存します。
ほぼすべてのプラットフォームで、HPjmeterは次の機能を提供します。
- 複数ウィンドウのGUIで、マーキングと検索の操作
- 以下を含む14のメトリクス
- メソッドの呼び出し回数
- 包含的および排他的メソッドの実行時間(CPU時間またはクロック時間)
- 呼び出し回数、またはCPU時間やクロック時間を含むインタラクティブなコール グラフ(使用できる場合)
- 割り当てられたがまだ残っているオブジェクトと割り当てた場所、オブジェクト リファレンス グラフ
- 平均実行時間、クラス時間など、導出メトリクス
- スレッドごと、またはプロセスごとの表示
- ロック コンテンション、インライン化、スローされた例外、メモリのリークに関するヒューリスティック
- パフォーマンス改善のトラッキングを比較する機能
さらに、HP-UXバージョンのHotSpot VMのユーザーには次の機能も提供されます。
- オーバーヘッドの低い拡張プロファイリング エージェント(-Xeprof オプション)
- 以下を含む、20の追加のメトリクス
- 全てのJavaメソッドについてのCPU時間とクロック時間
- ロック コンテンションのメトリクス
- ガベージコレクションとスレッド スターベーションを含む、Javaスレッドのライフタイムと、スレッドのライフタイム全体にわたるスレッド状態の分布を示す、スレッド ヒストグラム
- 追加の導出メトリクス
- プロファイリングによる割り込みを補償するためのCPU時間の修正
サポートされているJava製品のバージョン
HPjmeter はアプリケーションをプロファイルするために使用するJREと直接対話するのではなく、JREによって生成されたプロファイル データ ファイルを読み取ります。プロファイリング オプションによって収集したデータから生成されるプロファイル データ ファイルを利用してHPjmeterがデータを表示できるのは、以下のバージョンのJava製品です。
- HP-UX 11.0、11.11 (11i)および11.2x用Javaリリース1.3.xまたは1.4.xSDKおよびJRE、HotSpot VM(データは-Xeprofまたは-Xrunhprof オプションによって収集されます)
- HP-UX 11.0、11.11 (11i)および11.2x用Javaリリース1.3.xSDKおよびJRE、Classic VM(データは-Xrunhprof オプションによって収集されます)
- HP-UX 11.0、11.11 (11i)用Javaリリース1.2.2.05以上のSDKおよびJRE、HotSpot VM(データは-Xeprofオプションによって収集されます)
- HP-UX 10.20、HP-UX 11.0、HP-UX 11.11 (11i)用Javaリリース1.1.8JDKおよびJRE(データは-profおよび-eprofオプションによって収集されます)
- HP-UX 11.0、HP-UX 11.11 (11i)および11.2x用Javaリリース1.2.1または1.3.xSDKおよびJRE、Classic VM(データは-Xrunhprof オプションによって収集されます)
- Hewlett-Packard Chai VM 5.5以上(データは -Xrunhprof オプションによって収集されます)
- すべてのJava 1.4実装(データは、JavaSoft JDK-1.4.0-b92実装と互換の -Xrunhprof オプションによって収集されます)
- すべてのJava 1.3実装(データは、JavaSoft JDK-1.3.0-C実装と互換の -Xrunhprof オプションによって収集されます)
- すべてのJava 1.2実装(データは、JavaSoft JDK-1.2.1-A実装と互換の -Xrunhprof オプションによって収集されます)
- すべてのJava 1.1実装(データは -prof オプションによって収集されます)
システム要件
HPjmeterを実行するためには、以下のいずれかのシステム要件を満たす必要があります。
- Java Virtual Machine 1.1.6以上(開発環境は必要ありません)
および
- Swing 1.1パッケージ。これらは、Sun Microsystems, Inc.のJava Foundations Classesサイトから別途入手できます。
または:
- Swing 1.1パッケージを含む、任意のJava 2仮想マシン
インストール手順
HPjmeterは、圧縮されたTARファイルまたはZIPファイルとして入手できます。内容は両ファイルとも同じで、下記のコンポーネントファイルが含まれます。
- HPjmeter.jarファイル プログラム
- Java2Demo.eprof サンプル プロファイル データ ファイル
- HPjmeter.release.notes この ASCII ファイル
HPjmeterの圧縮されたTARファイル(HPjmeter-1.5.2.tar.gz)
または、
ZIPファイル(HPjmeter-1.5.2.zip)をダウンロードします。
圧縮されたTARファイルをダウンロードした場合は、次の手順に従います。
- ダウンロードしたバイナリ ファイル(HPjmeter-1.5.2.tar.gz)を好みのディレクトリに保存します。
- システムコマンドを利用して、次のように .tar.gzファイルをgunzipおよびuntarします。
gunzip HPjmeter-1.5.2.tar.gz
または、
tar xvf HPjmeter-1.5.2.tar
圧縮されたZIPファイル(HPjmeter-1.5.2.zip)をダウンロードした場合は、次の手順に従います。
- ダウンロードしたZIPファイルを好みのディレクトリに保存します。
- システムコマンドを利用して、次のようにファイルをunzipします。
unzip HPjmeter-1.5.2.zip :
または、
WinZip®または類似のプログラムを利用してファイルをunzipします。
HPjmeterの入手可能な新しいバージョンは、次の場所にあります。 http://www.hp.com/products1/unix/java/hpjmeter/またはhttp://www.HPjmeter.com/
Java 1.1.xでのHPjmeterの実行
HPjmeterはSwing 1.1を使用します。必ず、CLASSPATHに適切なSwing jarファイルを含めてください。以下に具体例を示します。 Swing 1.1は、Java Foundation ClassesのWebサイト(http://java.sun.com/products/jfc/download.html)から入手できます。
以下はcshにおける例です。
setenv DISPLAY <your display>:0.0
setenv SWINGLOC <directory in which swingall.jar installed>
setenv HPJMETERLOC <directory in which HPjmeter.jar installed>
setenv BASEPATH /opt/java/lib/classes.zip #インストールによります
setenv CLASSPATH $HPJMETERLOC/HPjmeter.jar:$SWINGLOC/swingall.jar:$BASEPATH
java -mx128m HPjmeter
以下はkshにおける例です。
export DISPLAY=<your display>:0.0
export SWINGLOC=<directory in which swingall.jar installed>
export HPJMETERLOC=<directory in which HPjmeter.jar installed>
export BASEPATH=/opt/java/lib/classes.zip #インストールによります
export CLASSPATH=$HPJMETERLOC/HPjmeter.jar:$SWINGLOC/swingall.jar
java -mx128m HPjmeter
Java 2でのHPjmeterの実行
Java 2ではSwingパッケージは標準拡張です。インストールしたり、パスを指定したりする必要はありません。
以下はcshにおける例です。
setenv DISPLAY <your display>:0.0 setenv HPJMETERLOC <directory in which HPjmeter.jar installed> java -mx128m -jar $HPJMETERLOC/HPjmeter.jar
以下はkshにおける例です。
export DISPLAY=<your display>:0.0
HPJMETERLOC=<directory in which HPjmeter.jar installed>
java -mx128m -jar $HPJMETERLOC/HPjmeter.jar
マニュアルとヘルプ
以下の情報を利用することができます。
HPjmeterの使用にあたっては、Javaコードの特別なコンパイルや準備は必要ありません -- 必要なのは、アプリケーションの実行時にプロファイリング オプションを指定することだけです。どのプロファイリング オプションを使用できるかは、使用しているJava仮想マシンのバージョンによって異なります。プロファイリング オプションについては、HPjmeterオンライン ヘルプ、リリースノートの「サポートされているJava製品のバージョン」の項でそれぞれ、説明しています。
プロファイリングを有効にしてアプリケーションを実行すると、仮想マシンは、実行中に収集されたプロファイル データをファイルにダンプします。HPjmeterはプロファイル データを後処理するので、ユーザーが解析を開始できるのは、アプリケーションの完了後です。
以下では、HPjmeterを使用してアプリケーションのプロファイリングを行う方法を説明します。
データ ファイルの読み込み
HPjmeterウェルカム スクリーンが表示されたら、アプリケーションで生成されたプロファイル データ ファイルを読み込むことができます。File > Openを選択し、そのファイルを選択します。
HPjmeterファイル選択ダイアログ ボックスでは、特定のファイル タイプを選択することも、すべてのデータ ファイルを表示することもできます。HPjmeterは、選択されたファイルの形式を自動的に認識します。
プロファイル データ ファイルの例 'Java2Demo.eprof' が添付されています。このファイルは、Java 2 JRE 1.3.1を利用するHP-UX 11.0 ワークステーションで、Sun Microsystems社のJava 2Dデモプログラムを実行することで入手できます。(下記で入手可能です。
http://java.sun.com/products/java-media/2D/ また、Java 2 SDKに含まれて配布されます。)
HPjmeterが現在サポートしているファイル形式は、以下の通りです。
- 標準のJava仮想マシン バージョン1.1.xで生成されるファイル形式(ファイル名拡張子は .prof)
- Java 2実装に含まれる'hprof'プロファイラによって生成されるファイル形式(ファイル名拡張子は .hprof.txt)
- HP-UX Javaバージョン1.1.8およびHP-UX SDK for the Java 2 Platform(Hotspot VMバージョン1.2.2.05以上、1.3.xまたは1.4.x用)で使用可能な拡張プロファイリング用独自形式(ファイル名拡張子は .eprof)
- Chai VM プロファイリング用独自形式(ファイル名は 'profile.cprof')
データ ファイルの読み込みが完了したら、適切なメニュー項目を選択して、そのアプリケーションに関する統計情報を表示できます。
メトリクスについて
プロファイル データはすべて、メトリクスによって表示されます。各メトリクスについてはオンライン ヘルプを参照してください。
メトリクスの1つはメソッドの呼び出し回数です。これは、アプリケーションの実行時全体で各メソッドが呼び出された回数です。これは、呼び出し回数の多い順に並べられます。最も頻繁に呼び出されたメソッドが、画面の一番上に表示されます。
メソッド名の出力形式はカスタマイズすることができます。クラスのパッケージ名と、メソッドの引き数タイプは個別にオン/オフすることができます。
各メソッドで費やされた時間を表すメトリクスもあります。これは、すべての実行時間の累積です。最も時間を費やしたメソッドが、画面の一番上に表示されます。
アプリケーションを解析するために、複数のメトリクスを同時に表示したい場合があります。HPjmeterでは、複数のウィンドウを開いて、同じプロファイル データ ファイルについて異なるメトリクスを表示したり、異なるファイルについて異なるメトリクスを表示したりできます。新しいウィンドウを開くには、Window > New Windowを選択します。
コール グラフについて
メトリクスだけでは、アプリケーションの制御フローの全体を表示することはできません。HPjmeterでは、コール グラフ情報も表示できます。コール グラフ情報を表示するには、Metric > Call Graph Treeを選択します。
コール グラフは、ツリー表示されます。ツリーの「ブランチ」(ノード)の横にある丸をクリックして、ノードを状況に応じて展開したり折り畳むことができます。
ブランチ データの階層を下っていくと、呼び出し元の下位に、呼び出されたメソッドが表示されます。字下げされた各行は、呼び出された1つのメソッドを表します。呼び出されたメソッドは時間の長い順に並べられ、最も問題があると考えられるメソッドが一番上に表示されます。
長い時間がかかっているノードを繰り返し展開し、ツリー階層を展開していくと、最も時間を要したプログラム タスクがどこで発生したかを突き止められます。
もう1つの便利な機能は、Editメニューのメソッド検索機能です。これを使用すると、パッケージ名、クラス名、またはメソッド名でメソッドを検索できます。検索を行うと、コール グラフ ツリーが自動的に展開され、検出したメソッドが表示されます。メソッド名をダブルクリックすると、そのメソッドの別の呼び出し元が表示されます。
スレッド パフォーマンスの解析
プロファイル データに適切な情報が含まれていれば、HPjmeterは、アプリケーションの実行中に作成されたスレッドを表示することができます。スレッドを表示するには、Metric > Threads Histogramを選択します。ヒストグラムには、個別の各スレッドの存続時間が表示されます。各スレッドのメトリクスを独立して表示することも可能です。これを行うには、ScopeメニューでThreadを選択します。
これは特に、使用しているアプリケーションに不可欠な処理を担当するスレッドを選択し、そのスレッドのパフォーマンスを向上したいような場合に便利です。
メモリの問題の解析
メモリの使用効率が悪いことも、アプリケーションのパフォーマンスが上がらない原因の1つになります。HPjmeterには、メモリの使用状況がわかるメトリクスがあります。アプリケーションの実行中に割り当てられたオブジェクト数を解析することは、メモリの使用状況を知る1つの方法です。プロファイル データに直接割り当ての数が含まれない場合、このメトリクスは、そのクラスのコンストラクタの呼び出しの数に基づいて評価されます。オブジェクトの数を表示するには、Metric > Created Objectsを選択します。
オブジェクト割り当ての検索
割り当てられたオブジェクトの数だけでなく、それらのオブジェクトがプログラムのどこで作成されたかについても知ることができます。
オブジェクトが作成された場所を検索するには、Metric > Created Objects (Count)を選択します。クラス名をダブルクリックすると、そのクラスのオブジェクトを割り当てたすべてのメソッドが、割り当てられたオブジェクトの数の順にリストされます。
メソッドにより生成されたオブジェクトのメトリクスを選択しても、そのメソッドに割り当てられたすべての種類のオブジェクトの数を表示することができます。
別のメモリ関連のメトリクスは、アプリケーションの実行が完了した時点でメモリに残っていた内容を表示するものです(Metric > Residual Objectsの順に選択)。これには、オブジェクトの配列、スカラ タイプの配列、および配列の配列が含まれます。
オブジェクト リファレンス グラフは、他のオブジェクトへのすべての参照とともに、すべての活動中のオブジェクトをヒープから表示します。そのようなメトリクスを解析することは、「メモリ リーク」の検知に役立つ場合があります(Java技術の場合、メモリ リークは、無意味に参照されるオブジェクトがあることを意味します)。
ヒューリスティック ヘルプ
HPjmeterには、パフォーマンスのボトルネックを予測する機能があります。Java技術におけるそのようなボトルネックの1つは、ロック コンテンションが高くなる場合です。これは、同期しているメソッドまたはステートメントのロックを取得するためのスレッドの待ち時間が長くかかるという、同期に関する問題です。ロック固有のプロファイル データがない場合でも、HPjmeterは、メソッドのクロック時間やコール グラフを使用して、ロック コンテンションの問題がどのメソッドで発生したかを検知できる場合があります。
長引くオブジェクトは「メモリ リーク」と呼ばれ、パフォーマンスの問題が発生する可能性のある領域です。HPjmeterは、ヒープダンプを解析して、メモリ上の他の多数のオブジェクトを保持している可能性のあるオブジェクトを見つけることができます。
また、コール グラフおよびメソッドの回数を解析することで、HPjmeterは、どのメソッドがアプリケーションの実行中に例外をスローしたか、または、どのメソッドがインライン化に最適かを示します。
ただし、HPjmeterはこの特定を推論的に行うものであることに留意してください。この機能は Guessメニューから選択することができます。
よくある質問
Q: HPjmeterはHP Itanium製品でも使用できますか。
A: HPjmeterは、すべてのItanium製品と互換です。
Java SDK 1.3.1.04 for Itanium で使用できるプロファイリング機能は
PA-RISCと同等のプロファイリング オプションを持っています。
Q: HPjmeterを実行するにはHP-UX Javaテクノロジが必要ですか。他のプラットフォームでも同じように動作しますか。
A: HPjmeterは完全にJavaで記述されています。Java 1.1やJava 2をサポートするプラットフォームであればどこでも動作します。ただし、Java 1.1をお使いの場合はSwing 1.1のパッケージが必要です。これは、Java Foundation ClassesのWebサイト(http://java.sun.com/products/jfc/download.html)から入手できます。
Q: HPjmeterを使って、他のプラットフォームから取得したプロファイリング データを解析することはできますか。
A: プロファイル データの取得にJava 1.1を使用していれば可能であると思われます。Java 2では、現在サポートされているhprofは、HP-UX SDK for the Java 2 platform、Classic Virtual Machine、JavaSoftのJDK-1.2.1-A、JDK-1.3.0-C、 SolarisまたはWindows NT用JDK-1.4.0-b92、またはそれと同等のものだけです。HP Chai VM 5.5 以上もサポートされています。
Q: Java VMでプロファイリング オプションを指定したのですが、プロファイル データ ファイルができなかったり、ファイルが完成していなかったりします。何が問題なのでしょうか。
A: 恐らく、アプリケーションの処理が完了する前にファイルを読もうとしたのだと思われます。またVMは、全てのスレッドが終了するか、System.exit()を呼び出すかで、正常終了していなくてはなりません。そのために、アプリケーションのコードに少々手を入れる必要がある場合もあります。VMのプロセスを抹消(kill)する際にプロファイル データが作成されるのはJava 1.4 以上のみです。
Q: HPjmeterはなぜこんなに遅いのですか。スクロールがスムーズにできないのですが。
A: Java 1.2の実装の多くは、リモート ディスプレイに関してパフォーマンス上の問題があります。特に、HPjmeterなどSwingを使用したアプリケーションで、この問題が起こります。可能であれば、HPjmeterは自分のワークステーションでローカルに実行してください。リモートで実行しなければならない場合は、Java 1.1を使用するか、HP-UX Java 1.3.xでFastSwingオプションを指定するとパフォーマンスを改善できることがあります。
Q: プロファイル データの中に<unknown caller>というラベルがあります。これは何でしょうか。
A: プロファイリング情報は、それぞれのメソッドの入り口と出口でJava仮想マシンによって収集されます。仮想マシンは、呼び出した側のメソッドを特定できなかった場合、<unknown caller>という名前を割り当てます。そのため、<unknown caller>という名前が複数のメソッドに表示されることがあります。普通、呼び出し側を認識できない理由は、それがJavaメソッドでない場合です。実際的には、<unknown caller> のエントリは仮想マシン自身を指していると考えてさしつかえありません。
Q: HPjmeterが表示するタイミング データの単位は何ですか。
A: サンプリングの場合、hprofは、オーバーヘッドを適切なレベルに抑えるため、様々なサンプリング インターバルを使用します。トレースによるプロファイリングの場合には、Java仮想マシンはミリ秒で計測します。ただし、プロファイリングの割り込み回数が非常に大きくなることがあります。SPECjvm98 (http://www.spec.org/)でのHotSpot VM(-Xeprof オプション) の割り込みによる速度の低下は3倍程度に抑えられています。ただし極端な場合、アプリケーションのプロファイリングで10倍以上の速度低下が発生することがあります。実際問題としては、多くの場合、本来の「時間」意味は失われます。タイミングの値は抽象的でプラットフォームに依存しない時間単位で計測されている、と考えてください。
Q: 特定のスレッドだけのパフォーマンス データを見ることはできますか。
A: できます。HotSpot JVMで-Xeprofオプションを使う、Java 2のhprofでthread=yオプションを使う、Java 1.1で-eprofオプションを使う、のいずれかの方法で可能です。
Q: 特定のタイム スライスだけのパフォーマンス データを見ることはできますか。
A: できません。ただし、大きなタイム スライスを使いたいのであれば、次の方法を試してみてください。アプリケーションを2度、プロファイリングします。まず、所定のタイム スライスの初めまで実行します。次に、そのスライスの最後まで実行します。データファイルが2つできますので、それをHPjmeterで比較します。この2つを全く同じ環境で実行すれば、そのタイム スライスについてのおおよそのメトリクスが得られます。
Q: 包含的メソッド実行時間のメトリクスを見ているのですが、1つあるいは複数のメソッドについて報告される時間が非常に大きいのです。アプリケーションの総実行時間よりも大きい値になります。何が間違っているのでしょうか。
A: 恐らく、手順に問題はないものと思われます。再帰関数で、このようなタイミング値が報告されることがあります。関数を実行するたびに、その呼び出しに関する時間が収集されます。再帰呼び出しの深さによっては、その合計時間はアプリケーションの実行時間よりも大きくなります。また、この見るからに不正な状況は、ある関数内で複数のスレッドが時間を使った場合にも報告されることがあります。
Q: コール グラフのツリーでノードを展開しようとしたのですが、子ノードが見えません。
A: あるノードのブランチが持っているタイミング値が全て、現在の切り捨て基準値よりも小さい、ということがあります。その場合、子ノードは表示されません。
Q: コール グラフ ツリーの表示を精度調整用スライダーで調整するにはどうすればいいでしょうか。
A: 方法は2つあります。1つは、スライダー ノブの横をクリックして、1を単位に切り捨て基準値を調整する方法です。もう1つは、ツリーを表示するダイアログ ウィンドウをツリー全体を表示するまで拡大し、画面の幅一杯に広げるというものです。ツリーがまだ小さい場合は、切捨て値を調整した方が良いでしょう。
Q: コール グラフ ツリーのトップレベルに複数のエントリがあります。これはなぜでしょうか。
A: Processのスコープでは、他のスレッドを呼んでいるがそれ自身は呼ばれていないと見られるスレッドはエントリを1つ生成します。こうしたメソッドはトップレベルに配置されます。コール グラフに複数のルートエントリがあるもう1つの理由は、プロファイリング エージェントがそれを呼び出したメソッドを見つけられなかった、というものです。これは、たとえば、java.lang.reflectパッケージを使っている場合に起こります。
Q: Guess - Lock Contentionが、同期していない、あるいは同期ステートメントを使っていないメソッドについても報告してきます。これはなぜでしょうか。
A: これは起こりえます。HPjmeterはモニターのロックについての情報を持っていません。そのため、どのメソッドの実行が遅れているかは、タイミングのデータを使って推測するしかないからです。
Q: HPjmeterの改良点についてアイディアがあります。知らせる方法はありますか。
A: java-tools-support@cup.hp.comに電子メールをお送りください。
ご注意
Copyright (c) Hewlett-Packard Company 1997-2002.All Rights Reserved.著作権法に基づく場合を除き、書面による事前の許可なく本ドキュメントを複製、改変、または翻訳することは禁止されています。 UNIXは、X/Open Company Limited が独占的にライセンスしている米国ならびに他の国における登録商標です。 本ドキュメントに掲載されている情報は正確を期していますが、市場性および特定目的に対する適合性の黙示保証などを含め、当社では本ドキュメントに関する一切の保証をいたしません。 また、当社は、本ドキュメントの誤り、および本ドキュメントの提供、実行、使用による偶発的または間接的な損害に対する責任は負いません。 本ドキュメントの情報は、予告なしに変更されることがあります。
JavaおよびJavaに関連する商標およびロゴは、米国および他の国でのSun Microsystems, Inc.の商標または登録商標です。
|