インテル® VTune™ Amplifier 2018 ヘルプ
インテル® VTune™ Amplifier を使用して Oracle* JDK または OpenJDK* (Linux* のみ) で実行される Java* アプリケーションを解析します。
Java* コードの実行がマネージドランタイム環境で制御されたとしても、データ管理の点からはネイティブ言語を使用して記述されたプログラムほど効果はありません。例えば、データマイニング Java* アプリケーションのパフォーマンスを意識するのであれば、ターゲット・プラットフォームのメモリー・アーキテクチャー、キャッシュ階層、メモリーレベルへのアクセスのレイテンシーを考慮する必要があります。プラットフォームのマイクロアーキテクチャーという点で見ると、Java* アプリケーションのプロファイルはネイティブ・アプリケーションのプロファイルに似ていますが、大きな違いが 1 つあります。それは、プログラムのソースコードに対するタイミングメトリックを確認するためプロファイル・ツールは、JVM でコンパイルされたまたはインタープリターで翻訳されたバイナリーコードのパフォーマンス・メトリックを、オリジナルの Java* または C/C++ ソースコードにマップできなければならない点です。
インテル® VTune™ Amplifier は、ユーザーモードのサンプリングおよびトレースと、ハードウェア・イベントベース・サンプリング解析タイプの両方で、低オーバーヘッドの JIT コンパイルされたコードの解析が可能です。インタープリターで処理される Java* メソッドの解析は、制限されます。
インテル® VTune™ Amplifier とインタープリターによる Java* コードの解析を有効にするには、次の操作を行います。
Java* コード向けにパフォーマンス解析を設定するには、GUI またはコマンドライン (amplxe-cl) 設定を使用します。次のいずれかの方法で Java* コードの解析を実行します。
アプリケーションを起動
1 つの方法として、バッチファイルや実行可能なスクリプトで java コマンドを指定する方法があります。例えば、次のコマンドを実行する run.bat ファイル (Windows*) または、run.sh ファイル (Linux*) を作成します。
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
そして、インテル® VTune™ Amplifier のプロジェクト設定で、起動するアプリケーションとしてこの run ファイルへのパスを指定します。例えば、Linux* では次のようになります。
また、[Managed code profiling mode (マネージドコードのプロファイル・モード)] に [Auto (自動)] を設定し、[Analyze child processes (子プロセスを解析)] オプションを選択します。
同様に、インテル® VTune™ Amplifier のコマンドライン・インターフェイス amplxe-cl でも解析を設定できます。例えば、Linux* 上で基本ホットスポット解析を行うには、次のコマンドラインを実行します。
> amplxe-cl -collect hotspots -- run.sh
または、次のように直接入力します。
> amplxe-cl -collect hotspots -- java -Xcomp -Djava.library.path=native_lib/ia32 -cp home/Design/Java/mixed_stacks MixedStacksTest 3 2
プロセスにアタッチ
Java* アプリケーションをしばらく実行する必要がある場合や、解析を開始する時点で起動できない場合、インテル® VTune™ Amplifier をスタンドアロンの Java* プロセスにアタッチすることもできます。Linux* では、ハードウェア・イベントベース・サンプリング解析タイプ向けに、インテル® VTune™ Amplifier を JVM インスタンスが組み込まれた C/C++ アプリケーションにアタッチすることができます。これには、[Attach to Process (プロセスにアタッチ)] ターゲットタイプを選択し、Java* プロセス名または PID を指定します。
コマンドラインを使用して Java* プロセスにアタッチして解析することもできます。例えば、次のコマンドラインは Java* プロセスへ基本ホットスポット解析をアタッチします。
> amplxe-cl -collect hotspots -target-process java
次のコマンドラインの例は、PID を使用して高度なホットスポット解析を Java* プロセスにアタッチしています。
> amplxe-cl -collect advanced-hotspots -target-pid 1234
低特権レベルのアカウントで実行されるプロセスにアタッチ (Linux* のみ)
ハードウェア・イベントベース・サンプリング解析タイプでは、スーパーユーザー権限で実行するインテル® VTune™ Amplifier を低い権限レベルのユーザーアカウントで実行される Java* プロセスや JVM インスタンスが組込まれた C/C++ アプリケーションへアタッチすることができます。例えば、インテル® VTune™ Amplifier を Java* ベースのデーモンやサービスにアタッチすることができます。
これを行うには、インテル® VTune™ Amplifier を root アカウントで実行し、[Attach to Process] ターゲットタイプを選択して Java* プロセス名や PID を指定します。
インテル® VTune™ Amplifier の基本ホットスポット解析を使用すると、最もホットなメソッドのリストとタイミングメトリックおよびコールスタックが表示されます。また、[Timeline (タイムライン)] ペインには、それぞれのスレッドに分散されるワークロードも表示されます。スレッドに名前を付けると、最もリソースを消費しているコードがどこで実行されたかを特定するのに便利です。
プラットフォームにおける最高のパフォーマンスを目指す開発者は、Java* プロジェクトのパフォーマンス・クリティカルなモジュールを、C やアセンブリーのようなネイティブ言語を用いて記述することがあります。このプログラミング手法を用いることで、ベクトル・コンピューティング (SIMD ユニットと命令セットにより実装) のような強力な CPU リソースを使用することができます。この場合、大部分の処理を行うことが予測される、計算集約型の関数がホットスポットとしてプロファイル結果に表示されます。しかし、ホットスポット関数だけでなく、それらの関数が JNI インターフェイスで呼び出された Java* コードの位置を特定したいこともあるでしょう。言語が混在するアルゴリズム実装におけるクロスランタイム呼び出しのような処理をトレースすることは課題の 1 つです。
言語が混在するコードのプロファイル結果の解析をサポートするため、インテル® VTune™ Amplifier は、Java* のコールスタックと後続の C/C++ 関数のネイティブなコールスタックを「関連付け」します (1 つにまとめます)。逆のコールスタックの関連付けも同様に行われます。
ネイティブ関数 |
ネイティブと Java* が混在した呼び出しスタック |
||
ネイティブモジュール |
Java* 呼び出しスタックでコンパイルされたメソッド |
コンパイル段階のインライン展開により、一部の関数はスタックに表示されない場合があることに注意してください。フィルターバーの [Inline Mode (インライン展開モード)] で [Show inline functions (インライン展開された関数を表示)] オプションを選択するのを忘れないでください。
また、インテル® VTune™ Amplifier は、プラットフォームで使用される CPU マイクロアーキテクチャー向けに Java* アプリケーションを最適化する高度なプロファイル・オプションを提供します。Java* や JVM テクノロジーはハードウェア・アーキテクチャー固有のコーディングからプログラマーを解放するように意図されているため、これは逆説的に思えるかもしれませんが、Java* コードが現在のインテル® マイクロアーキテクチャー向けに最適化されれば、将来の世代の CPU でも、おそらくこの利点は維持されます。CPU のパイプラインのハードウェア・イベントをモニターするハードウェア・イベントベース・サンプリング・データ収集を使用し、CPU の効率良い命令実行を制限するコーディング上の落とし穴を特定します。CPU メトリックが利用でき、アプリケーションのモジュール、関数、Java* コードのソース行に対して表示することができます。また、スタックを含むハードウェア・イベントベースのサンプリング収集も利用できます。これは、ドライバーやシステムのミドルウェア層で呼び出された関数の呼び出しパスを調べる必要があるときに役立ちます。
インテル® VTune™ Amplifier の Java* アプリケーション解析には、いくつかの制限事項があります。
システム全体のプロファイルは、マネージドコードではサポートされません。
JVM は、パフォーマンス上の理由により、呼び出し頻度の低いメソッドをコンパイルする代わりにインタープリターで解釈することがあります。インテル® VTune™ Amplifier は、インタープリターで解釈された Java* メソッドを認識しないため、そのような呼び出しはリストアされた呼び出しスタックで !Interpreter としてマークされます。
そのような関数名をスタック中で表示したい場合、-Xcomp オプションを使用して JVM に関数のコンパイルを強制します (この場合結果中で Compiled Java code メソッドとして表示されます)。しかし、実行中に多くの小さな関数やほとんど使用されない関数が呼び出された場合、タイミング特性は顕著に変わります。
ホットスポットに対応するソースコードを開くときに、インテル® VTune™ Amplifier は異なるコードブロックにイベントを関連付けたり、時間統計を割り当てることがあります。これは JDK Java* VM 固有の問題です。ループの場合、パフォーマンス・メトリックが上にずれます。また、ホットなメソッドのソースコードの最初の行に情報が表示されることがあります。次の例では、実際に最も CPU 時間を消費しているホットな行は 35 行目です。
イベントと時間のソースコード行への対応付けは、概算であると考えてください。
基本ホットスポット解析では、インテル® VTune™ Amplifier は呼び出しスタックの一部分のみを表示します。Windows* 上で完全なスタックを表示するには、JIT コンパイルでスタック対応付けの精度を高めるため、コマンドラインで追加の -Xcomp JDK Java* VM オプションを使用します。
Linux* で完全なスタックを表示するには、Java* VM の動作を変更するため追加のコマンドライン JDK Java* VM オプションを使用します。
-Xcomp コマンドライン JDK Java* VM オプションを使用して、JIT コンパイルでスタック対応付けの精度を高めます。
Linux* x86 では、サーバー Java* VM の代わりにクライアント Oracle* JDK Java* VM を使用します。つまり、Oracle* JDK Java* VM コマンドライン・オプションとして -client を明示的に指定するか、-server JDK Java* VM コマンドライン・オプションを指定しないようにします。
Linux* x64 では、インタープリターで解釈したメソッドとコンパイルバージョンのオンザフライ置換をオフにするコマンドライン・オプション -XX:-UseLoopCounter を指定します。
Java* アプリケーションのプロファイルは、基本ホットスポット、高度なホットスポット、およびマイクロアーキテクチャー解析タイプでサポートされます。インテル® VTune™ Amplifier がいくつかの組込み Java* 同期プリミティブ (オペレーティング・システムの同期オブジェクトを呼び出さない) を認識できないため、並行性およびロックと待機解析のサポートは制限されます。この制限により、いくつかのタイミングメトリックは正確な情報を示すことができません。
Java* ソースコードの収集制御用のユーザー API を提供する専用ライブラリーはありません。ただし、JNI 呼び出しで __itt 呼び出しをラップしてネイティブ API を適用することはできます。