このチュートリアルでは、Java プロファイリングのための Oracle Solaris Studio パフォーマンスアナライザの機能について説明します。これは、サンプルコードを使用してパフォーマンスアナライザで次を行う方法を示します。
「概要」ページ、「スレッド」ビュー、「関数」ビュー、「タイムライン」ビューを含むさまざまなデータビューでパフォーマンスデータを調べます。
Java コードと C++ コードの両方について「ソース」と「逆アセンブリ」を調べます。
ユーザーモード、エキスパートモード、およびマシンモードの違いを学習します。
プログラムを実行する JVM の動作にドリルダウンして、HotSpot コンパイル済みメソッドのために生成されるネイティブコードを確認します。
ユーザーコードによってガベージコレクタを呼び出す方法と、HotSpot コンパイラを呼び出す方法を確認します。
jsynprog は、Java プログラムに特有のサブタスクを多数含んでいる Java プログラムです。また、このプログラムは、C++ 共有オブジェクトをロードして、このオブジェクトからさまざまなルーチンを呼び出して、動的にロードされた C++ ライブラリから、Java コードからネイティブコードにシームレスに移行して再度ネイティブコードから Java コードに戻す方法を示します。
jsynprog.main は、さまざまなクラスから関数を呼び出すメインメソッドです。これは、Java Native Interface (JNI) 呼び出しによって gethrtime と gethrvtime を使用して独自の動作の時間を設定し、独自のタイミングでアカウンティングファイルを書き込んで、さらにはメッセージを stdout に書き込みます。
jsynprog.main には多数のメソッドがあります。
Routine.memalloc はメモリー割り当てを行い、ガベージコレクションを呼び出します
Routine.add_int は整数の加算を行います
Routine.add_double は倍精度 (浮動小数点) の加算を行います
Sub_Routine.add_int は、Routine.add_int をオーバーライドする派生呼び出しです
Routine.has_inner_class は内部クラスを定義してこれを使用します
Routine.recurse は直接的な再帰を示します
Routine.recursedeep は深い再帰を行なって、切り詰められたスタックをツールで処理する方法を示します
Routine.bounce は間接的な再帰を示します。この場合、bounce は、次に bounce への呼び出しを行う bounce_b を呼び出します
Routine.array_op は配列の演算を行います
Routine.vector_op はベクトル演算を行います
Routine.sys_op は、システムクラスのメソッドを使用します
jsynprog.jni_JavaJavaC: Java メソッドは、C 関数を呼び出す別の Java メソッドを呼び出します
jsynprog.JavaCJava: Java メソッドは、次に Java メソッドを呼び出す C 関数を呼び出します
jsynprog.JavaCC: Java は、別の C 関数を呼び出す C 関数を呼び出します
これらのメソッドの一部はほかのメソッドから呼び出されるため、すべてが最上位タスクを表しているわけではありません。
記録する実験で目にするデータは、ここで示されているものとは異なります。チュートリアルのスクリーンショットに使用される実験は、Oracle Solaris 11.2 が実行されている SPARC T5 システムで記録されました。Oracle Solaris または Linux を実行する x86 システムからのデータは異なります。さらに、データ収集には統計的な性質があり、同じシステムおよび OS で実行する場合でも実験ごとに異なります。
パフォーマンスアナライザの実際のウィンドウ構成は、スクリーンショットと厳密に一致しない場合があります。パフォーマンスアナライザでは、ウィンドウのコンポーネント間の区切りバーをドラッグしたり、コンポーネントを縮小したり、ウィンドウのサイズを変更したりできます。パフォーマンスアナライザはその構成を記録し、次回の実行時に同じ構成を使用します。チュートリアルで示しているスクリーンショットの取得過程で、多くの構成を変更しました。