logo

JVM (Java 仮想マシン) アーキテクチャ

  1. Java仮想マシン
  2. JVMの内部アーキテクチャ

JVM (Java Virtual Machine) は抽象的なマシンです。 Javaバイトコードを実行できる実行環境を提供する仕様です。

JVM は、多くのハードウェアおよびソフトウェア プラットフォームで利用できます (つまり、JVM はプラットフォームに依存します)。

JVMとは

それは次のとおりです。

  1. 仕様 Java仮想マシンの動作を指定します。ただし、実装プロバイダーはアルゴリズムを選択することは独立しています。その実装は Oracle およびその他の企業によって提供されています。
  2. 実装 その実装は JRE (Java ランタイム環境) として知られています。
  3. ランタイムインスタンス コマンド プロンプトで Java コマンドを記述して Java クラスを実行すると、JVM のインスタンスが作成されます。

何をするのか

JVM は次の操作を実行します。

  • コードをロードします
  • コードを検証します
  • コードを実行します
  • 実行環境を提供します

JVM は以下の定義を提供します。

  • メモリ領域
  • クラスファイル形式
  • レジスタセット
  • ガベージコレクションされたヒープ
  • 致命的なエラーの報告など

JVM アーキテクチャ

JVM の内部アーキテクチャを理解しましょう。クラスローダー、メモリ領域、実行エンジンなどが含まれます。

JVM アーキテクチャ

1) クラスローダー

クラスローダーは、クラス ファイルをロードするために使用される JVM のサブシステムです。 Java プログラムを実行するときは常に、最初にクラスローダーによってロードされます。 Java には 3 つの組み込みクラスローダーがあります。

    ブートストラップ クラスローダー: これは、拡張クラスローダーのスーパークラスである最初のクラスローダーです。それはロードします rt.jar java.lang パッケージ クラス、java.net パッケージ クラス、java.util パッケージ クラス、java.io パッケージ クラス、java.sql パッケージ クラスなど、Java Standard Edition のすべてのクラス ファイルが含まれるファイル。拡張クラスローダー: これは、Bootstrap の子クラスローダーであり、System クラスローダーの親クラスローダーです。内部にあるjarファイルをロードします $JAVA_HOME/jre/lib/ext ディレクトリ。システム/アプリケーションのクラスローダー: これは拡張クラスローダーの子クラスローダーです。クラスパスからクラスファイルをロードします。デフォルトでは、クラスパスは現在のディレクトリに設定されます。 「-cp」または「-classpath」スイッチを使用してクラスパスを変更できます。アプリケーション クラスローダーとも呼ばれます。
 //Let's see an example to print the classloader name public class ClassLoaderExample { public static void main(String[] args) { // Let's print the classloader name of current class. //Application/System classloader will load this class Class c=ClassLoaderExample.class; System.out.println(c.getClassLoader()); //If we print the classloader name of String, it will print null because it is an //in-built class which is found in rt.jar, so it is loaded by Bootstrap classloader System.out.println(String.class.getClassLoader()); } } 
今すぐテストしてください

出力:

 sun.misc.Launcher$AppClassLoader@4e0e2f2a null 

これらは、Java によって提供される内部クラスローダーです。独自のクラスローダーを作成する場合は、ClassLoader クラスを拡張する必要があります。

2) クラス(メソッド)エリア

クラス(メソッド)領域には、実行時定数プール、フィールドおよびメソッドのデータ、メソッドのコードなどのクラスごとの構造が格納されます。

3) ヒープ

オブジェクトが配置される実行時データ領域です。

4) スタック

Java スタックはフレームを保存します。ローカル変数と部分的な結果を保持し、メソッドの呼び出しと戻りに関与します。

各スレッドにはプライベート JVM スタックがあり、スレッドと同時に作成されます。

メソッドが呼び出されるたびに、新しいフレームが作成されます。フレームは、メソッドの呼び出しが完了すると破棄されます。

5) プログラムカウンターレジスタ

PC (プログラム カウンタ) レジスタには、現在実行されている Java 仮想マシン命令のアドレスが含まれます。

6) ネイティブメソッドスタック

これには、アプリケーションで使用されるすべてのネイティブ メソッドが含まれています。

7) 実行エンジン

を含む:

    仮想プロセッサ 通訳者:バイトコード ストリームを読み取り、命令を実行します。ジャストインタイム(JIT)コンパイラ:パフォーマンスを向上させるために使用されます。 JIT は、同様の機能を持つバイト コードの部分を同時にコンパイルするため、コンパイルに必要な時間が短縮されます。ここで、「コンパイラ」という用語は、Java 仮想マシン (JVM) の命令セットから特定の CPU の命令セットへの変換器を指します。

8) Java ネイティブ インターフェイス

Java Native Interface (JNI) は、C、C++、アセンブリなどの別の言語で書かれた別のアプリケーションと通信するためのインターフェースを提供するフレームワークです。Java は JNI フレームワークを使用して、出力をコンソールに送信したり、OS ライブラリと対話したりします。