HPROF プロファイラーの使用

HPROF は、 IBM® SDK に同梱されているデモンストレーション・プロファイラーであり、JVMTI を使用して Java™ の実行に関する情報を収集および記録します。 HPROF を使用して、プログラムのどの部分が最も多くのメモリーやプロセッサー時間を使用しているのかを調べることができます。

お使いのアプリケーションの効率性を高めるには、コードのどの部分が大量のメモリーやプロセッサー・リソースを使用しているのかを知る必要があります。 HPROF は、サンプル版の JVMTI エージェントであり、次の構文を使用して起動します。
java -Xrunhprof[:<option>=<value>,...] <classname>

HPROF を使用して Java を実行すると、プログラムの終了時にファイルが作成されます。 このファイルは、現行作業ディレクトリーに配置されて、異なるファイル名を指定しない限り、java.hprof.txt という名前 (バイナリー・フォーマットを使用している場合は java.hprof) が付けられます。 このファイルにはいくつかのセクションが含まれていますが、具体的なフォーマットと内容は選択されたオプションによって異なります。

HPROF について、このセクションに記載されている情報より詳細な情報が必要な場合は、「 https://docs.oracle.com/javase/8/docs/technotes/samples/hprof.html」を参照してください。

コマンドjava -Xrunhprof:help は、使用可能なオプションを表示します。

heap=dump|sites|all
このオプションは、メモリー使用状況を分析するのに役立ちます。 このオプションは HPROF に対してスタック・トレースを生成するように指示し、これらのスタック・トレースからメモリーの割り振り場所を確認できます。 heap=dump オプションを使用すると、ヒープ内のすべてのライブ・オブジェクトのダンプが得られます。 heap=sites オプションを使用すると、最も割り振り度の高いオブジェクトが先頭に表示された、サイトのソート済みリストが得られます。 デフォルト値の all を使用すると、これらの両方の出力が得られます。
cpu=samples|times|old
cpu オプションを使用すると、多くのプロセッサー時間が費やされている場所を特定するのに役立つ情報が得られます。 cpusamples に設定すると、JVM は実行を一時停止して、どのメソッド呼び出しがアクティブなのかを確認します。 サンプリング・レートが十分に高い場合は、プログラムが多くの時間を費やしている場所がよくわかります。 cputimes に設定すると、各メソッドが呼び出された回数とそれぞれの実行にかかった時間の正確な測定値が得られます。 このオプションを使用すると、正確性は高まりますが、プログラムの速度は低下します。 cpuold に設定すると、プロファイル・データが旧来の HPROF フォーマットで生成されます。
interval=y|n
interval オプションは cpu=samples のみに適用され、スレッド・スタックのサンプル間でサンプリング・スレッドがスリープする時間を制御します。
monitor=y|n
monitor オプションは、同期がアプリケーションのパフォーマンスに与える影響を理解するのに役立ちます。 モニターはスレッド同期を実装します。 モニターに関する情報を取得することで、さまざまなスレッドが既にロックされているリソースにアクセスしようとしているときにどれだけの時間を 費やしているのかがわかります。 HPROF は、使用中のモニターのスナップショットも提供します。 この情報はデッドロックを検出するのに役立ちます。
format=a|b
出力ファイルのデフォルトは ASCII フォーマットです。 バイナリー・フォーマット (Heap Analysis Tool などの一部のユーティリティーで必要) を指定する場合は、format を「b」に設定してください
file=<filename>
file オプションを使用すると、出力ファイルの名前を変更できます。 ASCIIファイルのデフォルト名はjava.hprof.txtです。 バイナリー・ファイルのデフォルト名は java.hprofです。
force=y|n
一般に、デフォルト値 (force=y) を使用すると、出力ファイル内の既存情報がすべて上書きされます。 このため、HPROF を有効にして複数の JVM を実行している場合は、force=n を使用して、必要に応じて出力ファイル名に追加の文字を付加してください。
net=<host>:<port>
出力をローカル・ファイルに送信せずにネットワーク経由で送信するには、net オプションを使用します。
depth=<size>
depth オプションでは、スタック・トレースに表示するメソッド・フレームの数を指定します。 デフォルト値は 4 です。
thread=y|n
thread オプションを y に設定すると、各トレースの横にスレッド ID が出力されます。 このオプションが役に立つのは、どのスレッドがどのトレースと関連付けられているのがか不明な場合です。 この種の問題は、マルチスレッド・アプリケーションの場合に発生する可能性があります。
doe=y|n
デフォルトでは、アプリケーションの終了時にプロファイル情報が収集されます。 実行時にプロファイル・データを収集するには、doe (dump on exit) を n に設定します。
msa=y|n
この機能は、 IBM SDK プラットフォームではサポートされていません。
cutoff=<value>
合計実行時間のわずかな割合に対して、多くのサンプル・エントリーが生成されます。 デフォルトでは、HPROF にはプロセッサーでかかった時間の 0.0001% 以上に相当する実行パスがすべて含まれます。 このオプションを使用するとこのカットオフ基準値を変更できます。 例えば、合計実行時間の 1% の 4 分の 1 未満に相当するすべてのエントリーを除外するには、 cutoff=0.0025 と指定します。
verbose=y|n
このオプションは、ダンプを取得した際にメッセージを生成します。 デフォルトは yです。
lineno=y|n
通常は各フレームに処理された行番号が含まれていますが、このオプションを使用すると、出力リストの行番号を表示しないようにすることができます。 有効になる場合、各フレームには行番号の代わりにテキストUnknown lineが含まれます。
TRACE 1056:
java/util/Locale.toUpperCase(Locale.java:Unknown line)
java/util/Locale.<init>(Locale.java:Unknown line)
java/util/Locale.<clinit>(Locale.java:Unknown line)
sun/io/CharacterEncoding.aliasName(CharacterEncoding.java:Unknown line)