Oracle® Solaris Studio 12.4: パフォーマンスアナライザ

印刷ビューの終了

更新: 2015 年 1 月
 
 

Java テクノロジーベースのソフトウェア実行の概要

典型的な開発者にとっては、Java テクロノジーベースのアプリケーションはほかのプログラムと同じように動作します。このアプリケーションは、一般に class.main というメインエントリポイントから始まり、C または C++ アプリケーションの場合と同様に、ほかのメソッドを呼び出すことがあります。

オペレーティングシステムにとっては、Java プログラミング言語で書かれたアプリケーション (純粋なものか、C/C++ が混合しているもの) は JVM ソフトウェアをインスタンス化するプロセスとして動作します。JVM ソフトウェアは C++ ソースからコンパイルされ、_start から実行を開始し、それが main を呼び出すというように処理が進行します。このソフトウェアは ..class ファイルまたは .jar ファイル、あるいはその両方からバイトコードを読み取り、そのプログラムで指定された操作を実行します。指定できる操作の中には、ネイティブ共有オブジェクトの動的な読み込みや、そのオブジェクト内に含まれている各種関数やメソッドへの呼び出しがあります。

JVM ソフトウェアは、従来の言語で記述されたアプリケーションでは一般に行われない多数の動作を行います。このソフトウェアは、起動時に、動的に生成されたコードの多数の領域をそのデータ領域内に作成します。これらの領域の 1 つは、アプリケーションのバイトコードメソッドを処理するために使用される実際のインタプリタコードです。

Java テクノロジベースのアプリケーションの実行中、ほとんどのメソッドは JVM ソフトウェアによって解釈されます。これらのメソッドは、解釈されたメソッドと呼ばれます。Java HotSpot 仮想マシンによって、バイトコードの解析時にパフォーマンスがモニターされ、頻繁に実行されているメソッドが検出されます。繰り返し実行されているメソッドは、Java HotSpot 仮想マシンによってコンパイルされ、マシンコードが生成される場合があります。結果となるメソッドは、コンパイルされたメソッドと呼ばれます。仮想マシンはそれ以降、そのメソッドの元のバイトコードを解釈するのではなく、より効率的なコンパイルされたメソッドを実行します。コンパイルされたメソッドはアプリケーションのデータ領域に読み込まれ、その後のある時点で読み込み解除することができます。さらに、インタプリタされたコードとコンパイルされたコードの間の変換を行うために、ほかのコードがデータ領域で生成されます。

Java プログラミング言語で記述されたコードはまた、ネイティブでコンパイルされたコード (C、C++、Fortran のいずれか) を直接呼び出すこともあります。このような呼び出しのターゲットは、ネイティブメソッドと呼ばれます。

Java プログラミング言語で記述されたアプリケーションは本質的にマルチスレッド型で、ユーザーのプログラム内でスレッドごとに 1 つの JVM ソフトウェアスレッドがあります。Java アプリケーションはまた、シグナル処理、メモリー管理、Java HotSpot 仮想マシンのコンパイルに使用されるハウスキーピングスレッドもいくつかあります。

データの収集は、J2SE の JVMTI にあるさまざまなメソッドを使用して実装されます。

Java 呼び出しスタックとマシン呼び出しスタック

パフォーマンスツールは、各スレッドの存続期間中にイベントを記録するほか、イベント時に呼び出しスタックを記録することによってデータを収集します。任意のアプリケーションの実行の任意の時点で、呼び出しスタックは、プログラムが実行のどの段階まで、またどのように達したかを表します。混合モデルの Java アプリケーションが従来の C、C++、および Fortran アプリケーションと異なる 1 つの重要な点は、ターゲットの実行中のどの時点でも、Java 呼び出しスタックとマシン呼び出しスタックという 2 つの呼び出しスタックが意味を持つことです。どちらの呼び出しスタックもプロファイリング中に記録され、解析中に調整されます。

クロックプロファイリングとハードウェアカウンタオーバーフロープロファイリング

Java プログラムに対するクロックプロファイリングとハードウェアカウンタオーバーフロープロファイリングは、Java 呼び出しスタックとマシン呼び出しスタックの両方が収集される点を除き、C、C++、および Fortran プログラムの場合と同様に機能します。