JVMアーキテクチャ
- JVMとは
JVMの正式名称はJava Virtual Machine(Java仮想マシン)で、コンピュータをシミュレートすることでコンピュータのすべての機能を実現し、Javaのクロスプラットフォーム機能を実現しています。
JVMとは
- JVMがどのようなもので、どのようなコンポーネントから構成されているかを正確に制約する抽象的な仕様。
- 具体的な実装、いわゆる具体的な実装は、具体的な実装の同じまたは異なるプラットフォーム上のソフトウェアまたはソフトウェアとハードウェアの組み合わせで、この抽象的な仕様に従って異なるベンダーです。
- 実行中のインスタンスは、Javaプログラムを実行するときに実行中のインスタンスとなり、実行中のJavaプログラムはすべてJVMインスタンスとなります。
JVMと物理マシンは、適切な命令セットを持っている必要があります、この命令セットは、JVMのパース実行することができます。この命令セットはJVMバイトコード命令セットと呼ばれ、バイトコードのクラスファイルの仕様に沿って、JVMによって実行することができます。
- JVMアーキテクチャ
命令セットとは別に、JVMのアーキテクチャは基本的に4つの部分から構成されています:
- 起動時またはクラス実行時に、必要なクラス・ファイルをJVMにロードするクラス・ローダー。
- 実行エンジン、実行エンジンのタスクは、タイミングマシン上のCPUに相当するクラスファイルに含まれるバイトコード命令の実行を担当しています。
- メモリー・エリア。メモリーをいくつかのエリアに分割し、実機上のさまざまな機能のレジスタやPCポインターのレコーダーなど、実機上の記憶・記録・動員モジュールをシミュレートします。
- ネイティブ・メソッド呼び出し、ネイティブ・メソッドのCまたはC++実装を呼び出すコードは結果を返します。
JVM仕組み
前節ではJVMの基本構造を簡単に紹介しましたが、以下では実行エンジンがどのように動作するかを簡単に分析します。
通常、プログラムは執筆から実行まで、次のような段階を経ます:
ソースコード>プリプロセッサの>コンパイラ>アセンブラ>オブジェクト・コード>リンカ>実行可能プログラム
スタック・ベースのJVM
JVMは、スタック・ベースのアーキテクチャでバイトコード命令を実行します。つまり、すべてのオペランドがまずスタックにロードされなければなりません。次に、命令内のオペコードに基づいて計算を実行するために、いくつかの要素がスタックの先頭からポップ・オフされ、その結果がスタックにプレスされます。JVMでは、オペランドを各スタック・フレーム内のローカル変数セットに格納することができます。つまり、ローカル変数セットは各メソッド呼び出しに割り当てられ、このローカル変数セットはコンパイル時に決定されているため、スタック上のオペランドを直接スタック上の定数にすることも、ローカル変数セットから変数をスタックにプレスすることもできます。これは一般的なレジスタベースの演算とは異なり、演算はスタックから頻繁に出し入れする必要があります。例えば加算演算のように、2つのオペランドがローカル変数にある場合、加算演算には5回のスタック操作が必要で、それぞれローカル変数から2つのオペランドをスタックに入れ、次に加算演算に使用する2つのオペランドをスタックから出し、その結果をスタックに押し込みます。
スタックアーキテクチャを使用する理由
- JVMは、マシン・チップによってはレジスタが不規則だったり少なすぎたりするため、プラットフォームに依存しないように設計されています。
- 指示のコンパクト化のために。
実行エンジン・アーキテクチャ 新しいスレッドが作成されるたびに、JVMはスレッド用のJavaスタックを作成し、スレッド用の実行可能コードの最初の行を指すPCレジスタをスレッドに割り当てます。新しいメソッドが呼び出されるたびに、新しいスタックフレームデータ構造がスタック上に作成され、メソッドで定義されたローカル変数、定数プーリングをサポートするためのいくつかの構文解析、通常のメソッドリターン、例外処理メカニズムなど、メソッドに関するメタ情報が保持されます。
JVMは、特定の命令を呼び出すときに定数プール内の定数のいくつかを使用したり、定数によって表されるデータや、このデータによって指されるインスタンス化されたオブジェクトを取得したりする必要があるかもしれません。





