Java* コード解析

インテル® VTune™ プロファイラーを使用して、Oracle* や OpenJDK* (Linux* のみ) で実行される Java* アプリケーションを解析します。

Java* コードの実行がマネージドランタイム環境で制御されたとしても、データ管理の点からはネイティブ言語を使用して記述されたプログラムほど効果はありません。例えば、データマイニング Java* アプリケーションのパフォーマンスを意識するのであれば、ターゲット・プラットフォームのメモリー・アーキテクチャー、キャッシュ階層、メモリーレベルへのアクセスのレイテンシーを考慮する必要があります。プラットフォームのマイクロアーキテクチャーという点で見ると、Java* アプリケーションのプロファイルはネイティブ・アプリケーションのプロファイルに似ていますが、大きな違いが 1 つあります。それは、プログラムのソースコードに対するパフォーマンス・メトリックを確認するには、プロファイル・ツールは JVM* でコンパイルまたは解釈されたバイナリーコードのメトリックを、オリジナルの Java* または C/C++ ソースコードにマップできなければならない点です。

VTune インテル® VTune™ プロファイラーは、JIT コンパイル済みコードの低オーバーヘッド解析を実行できます。これは、ユーザーモード・サンプリングとトレース、およびハードウェア・イベントベース・サンプリング解析の両方のタイプでサポートされます。解釈された Java* メソッドの解析は 制限されます。

インテル® VTune™ プロファイラーで Java* コード解析を有効にしてデータを解釈するには、次の操作を行います。

Java* データ収集を設定する

Java* コード向けにパフォーマンス解析を設定するには、GUI またはコマンドライン (vtune) 設定のいずれかを使用します。次のモードを使用して Java* コード解析を行います。

[アプリケーションを起動] モードで Java* 解析を設定するには:

  1. バッチファイルや実行可能なスクリプトで java* コマンドを指定します。

    例えば、Windows* 上で run.bat ファイルまたは Linux* で run.sh ファイルを作成し、次のコマンドを埋め込みます。

    Windows* :

    > java.exe -Xcomp -Djava.library.path=native_lib\ia32 -cp C:\Design\Java\mixed_stacks MixedStacksTest 3 2

    Linux* :

    $ java -Xcomp -Djava.library.path=native_lib/ia32 -cp /home/Design/Java/mixed_stacks MixedStacksTest 3 2

  2. プロジェクトを作成します。

  3. [解析の設定] ウィンドウから、 [どこを] ペインを選択し、解析システム (例えば、 [ローカルホスト]) を指定します。

  4. [何を] ペインで、 [アプリケーションを起動] ターゲットタイプを選択します。

  5. [アプリケーション] フィールドで run ファイルへのパスを指定します。Linux* の例:

  6. [高度] セクションの [マネージドコードのプロファイル・モード] [自動] モードを選択し、 [子プロセスを解析] オプションを有効にします。

同様に、インテル® VTune™ プロファイラーのコマンドライン・インターフェイス vtune で解析を設定することもできます。例えば、Linux* のホットスポット解析では、次のコマンドを実行します。

$ vtune -collect hotspots -- run.sh

または

$ vtune -collect hotspots -- java -Xcomp -Djava.library.path=native_lib/ia32 -cp home/Design/Java/mixed_stacks MixedStacksTest 3 2

[プロセスにアタッチ] モードで Java* 解析を設定するには:

Java* アプリケーションをしばらく実行する必要がある場合や、解析を開始するときに起動できない場合、インテル® VTune™ プロファイラーをスタンドアロンの Java* プロセスにアタッチすることができます。Linux* では、ハードウェア・イベントベース・サンプリング解析タイプの組込み JVM* インスタンスを使用して、インテル® VTune™ プロファイラーを C/C++ アプリケーションにアタッチできます。 これを有効にするには、[何を] ペインで [プロセスにアタッチ] ターゲットタイプを選択して、 java* プロセス名または PID を指定します。

コマンドライン・インターフェイスを使用して、解析を Java* プロセスにアタッチすることもできます。例えば、次のコマンドはホットスポット解析を Java* プロセスにアタッチします。

$ vtune -collect hotspots -target-process java

次のコマンドラインの例は、ホットスポット解析を PID を使用して Java* プロセスにアタッチします。

$ vtune -collect hotspots -target-pid 1234

動的なアタッチは、Java* 開発キット (JDK*) でのみサポートされます。

低い権限のアカウントで [プロセスにアタッチ] モードの Java* 解析を設定するには、次の操作を行います (Linux* のみ):

ハードウェア・イベントベース・サンプリング解析タイプでは、スーパーユーザー権限で実行するインテル® VTune™ プロファイラーを、低い権限レベルのユーザーアカウントで実行される Java* プロセスや JVM* インスタンスが組込まれた C/C++ アプリケーションへアタッチすることができます。例えば、インテル® VTune™ プロファイラーを Java* ベースのデーモンやサービスにアタッチすることができます。

これを行うには、root アカウントでインテル® VTune™ プロファイラーを起動し、 [プロセスにアタッチ] ターゲットタイプを選択して、 java* プロセス名または PID を指定します。

最もホットなメソッドを特定する

ホットスポット解析を使用すると、最もホットなメソッドのリストとタイミングメトリックおよびコールスタックが表示されます。スレッドのワークロード分布も [タイムライン] ペインに表示されます。スレッドに名前を付けると、最もリソースを消費しているコードがどこで実行されたかを特定するのに便利です。以下に Linux* の例を示します。

混在コードのスタックを解析する

プラットフォームにおける最高のパフォーマンスを目指すため、Java* プロジェクトのパフォーマンス・クリティカルなモジュールを、C やアセンブリーのようなネイティブ言語で記述してコンパイルする手法を用いることがあります。このプログラミング手法を用いることで、ベクトル・コンピューティング (SIMD ユニットと命令セットにより実装) のような強力な CPU リソースを使用することができます。この場合、大部分の処理を行うことが期待される、計算を多用する関数がホットスポットとしてプロファイル結果に表示されます。しかし、ホットスポット関数だけでなく、それらの関数が JNI インターフェイスで呼び出さ経由 Java* コードの位置を特定したいこともあります。言語が混在するアルゴリズム実装においてそのようなクロスランタイム呼び出しをトレースすることは課題の 1 つです。

混在コードのプロファイル結果を解析するため、インテル® VTune™ プロファイラーは、Java* のコールスタックと後続の C/C++ 関数のネイティブなコールスタックを「スティッチ」します (1 つにまとめます)。逆のコールスタックのスティッチも行われます。以下に Windows* の例を示します。

ネイティブ関数

ネイティブ/Java* 混在コールスタック

ネイティブモジュール

Java* コールスタックのコンパイル済みメソッド

コンパイル時のインライン展開により、デフォルトでは一部の関数がスタックに表示されないことに注意してください。 フィルターバーの [インラインモード] で、[インライン関数を表示] オプションが選択されていることを確認してください。

ハードウェア・メトリックを解析する

インテル® VTune™ プロファイラーは、プラットフォームの CPU マイクロアーキテクチャー向けに Java* アプリケーションを最適化する高度なプロファイル・オプションを提供します。Java* や JVM* テクノロジーは、ハードウェア・アーキテクチャー固有のコーディングから開発者を解放するように意図されていますが、Java* コードを現在のインテル® アーキテクチャー向けに最適化すれば、将来の世代の CPU でも、おそらくこの利点は維持されます。 ハードウェア・イベントベース・サンプリングによるデータ収集を使用して、CPU のパイプラインのハードウェア・イベントをモニターし、CPU の効率良い命令実行を制限するコードの過ちを特定します。 CPU メトリック は、アプリケーションのモジュール、関数、Java* コードのソース行に対して表示することができます。また、ドライバーやシステムのミドルウェア層で呼び出された関数の呼び出しパスを調べる必要がある場合、 スタックを含むハードウェア・イベントベースのサンプリング収集を利用できます。

制限事項

インテル® VTune™ プロファイラーは、制限付きで Java* アプリケーションの解析をサポートします。

関連情報