JVMとは何ですか? Java 仮想マシン Archi構造

JVMとは何か Java?

Java 仮想マシン (JVM) は、実行環境を提供するエンジンであり、 Java コードやアプリケーション。 Java バイトコードを機械語に変換する。JVMは Java ランタイム環境(JRE)。他のプログラミング言語では、コンパイラは特定のシステム用のマシンコードを生成します。しかし、 Java コンパイラは、仮想マシン用のコードを生成します。 Java 仮想マシン。

JVMはどのように動作するのでしょうか?

まず、 Java コードはバイトコードにコンパイルされます。このバイトコードは異なるマシン上で解釈されます。ホストシステムと Java ソースでは、バイトコードは中間言語です。JVMでは Java メモリ空間の割り当てを担当します。


JVM の仕組み
の作業 Java 仮想マシン (JVM)

この JVM チュートリアルでは、次のことを学びます。

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

この JVM チュートリアルでは、 ArchiJVMのアーキテクチャ。 Java クラスローダー、メモリ領域、実行エンジンなどが含まれます。

 


JVM Archi構造
Java 仮想マシン Archi構造

1) クラスローダー
クラス ローダーは、クラス ファイルをロードするために使用されるサブシステムです。ロード、リンク、初期化という 3 つの主要な機能を実行します。

2) メソッドエリア
JVM メソッド領域には、メタデータ、定数ランタイム プール、メソッドのコードなどのクラス構造が格納されます。

3) ヒープ
すべて オブジェクト、それらに関連するインスタンス変数、および配列はヒープに保存されます。 このメモリは共通であり、複数のスレッド間で共有されます。

4) JVM 言語スタック
Java language スタックには、ローカル変数とその部分的な結果が格納されます。各スレッドには独自の JVM スタックがあり、スレッドの作成と同時に作成されます。メソッドが呼び出されるたびに新しいフレームが作成され、メソッド呼び出しプロセスが完了すると削除されます。

5) PCレジスタ
PCレジスタは、 Java 現在実行中の仮想マシン命令。 Java各スレッドには個別の PC レジスタがあります。

6) ネイティブメソッドスタック
ネイティブメソッドスタックはネイティブライブラリに依存するネイティブコードの命令を保持します。ネイティブメソッドスタックはネイティブライブラリではなく別の言語で記述されます。 Java.

7) 実行エンジン
これは、ハードウェア、ソフトウェア、またはシステム全体をテストするために使用されるソフトウェアの一種です。 テスト実行エンジンは、テストされた製品に関する情報を一切伝えません。

8) ネイティブメソッドインターフェース
ネイティブメソッドインターフェースはプログラミングフレームワークです。 Java ライブラリやネイティブ アプリケーションから呼び出すために JVM で実行されているコード。

9) ネイティブメソッドライブラリ
ネイティブライブラリは、ネイティブライブラリ(C、 C++) は実行エンジンで必要になります。

ソフトウェアコードのコンパイルと実行プロセス

ソフトウェアプログラムを作成して実行するには、次のものが必要です。

1) 編集者 – プログラムを入力するには、メモ帳を使用できます。

2) コンパイラ – 高級言語プログラムをネイティブのマシンコードに変換するには

3) リンカー – メインプログラム内の異なるプログラムファイル参照を結合するには。

4) ローダー – 実行のためにハードディスク、フラッシュドライブ、CD などの二次記憶装置から RAM にファイルをロードします。 コードを実行すると、読み込みが自動的に行われます。

5) 実行 – OS およびプロセッサによって処理されるコードの実際の実行。

この背景を踏まえて、次のビデオを参照して、JVMの内部動作とJVMのアーキテクチャを学習してください(Java 仮想マシン)。

クリック こちら ビデオにアクセスできない場合

C コードのコンパイルと実行プロセス

を理解する Java コンパイルプロセス Javaまず、C でのコンパイルとリンクのプロセスを簡単に見てみましょう。

main で、1 つの関数 f2 と f1 を呼び出しているとします。main 関数はファイル aXNUMX.c に格納されています。

C コードのコンパイルと実行プロセス

関数 f1 はファイル a2.c に格納されます。

C コードのコンパイルと実行プロセス

関数 f2 はファイル a3.c に格納されます。

C コードのコンパイルと実行プロセス

これらのファイル、つまり a1.c、a2.c、a3.c はすべてコンパイラに渡されます。コンパイラの出力は、マシン コードである対応するオブジェクト ファイルです。

C コードのコンパイルと実行プロセス

次のステップでは、リンカーを使用して、これらすべてのオブジェクト ファイルを XNUMX つの .exe ファイルに統合します。 リンカーはこれらすべてのファイルをまとめて .exe ファイルを生成します。

C コードのコンパイルと実行プロセス

プログラムの実行中、ローダー プログラムは .exe を RAM 処刑のために。

C コードのコンパイルと実行プロセス

Java コードのコンパイルと実行 Java VM

この JVM チュートリアルでは、JAVA のプロセスを見てみましょう。 メインには、f1 と f2 の XNUMX つのメソッドがあります。

  • main メソッドはファイル a1.java に保存されます。
  • f1 は a2.java としてファイルに保存されます
  • f2 は a3.java としてファイルに保存されます

Java コードのコンパイルと実行 Java VM

コンパイラは 3 つのファイルをコンパイルし、バイト コードで構成される XNUMX つの対応する .class ファイルを生成します。 C とは異なり、リンクは行われません。.

この Java VMまたは Java 仮想マシンは RAM 上に存在します。実行中、クラス ローダーを使用してクラス ファイルが RAM 上に持ち込まれます。BYTE コードはセキュリティ違反がないか検証されます。

Java コードのコンパイルと実行 Java VM

次に、実行エンジンはバイトコードをネイティブマシンコードに変換します。これはジャストインタイムコンパイルです。これが、 Java 比較的遅いです。

Java コードのコンパイルと実行 Java VM

注: JIT またはジャストインタイムコンパイラは、 Java 仮想マシン (JVM)。同時に同様の機能を持つバイトコードの一部を解釈します。

なぜですか Java 解釈型言語とコンパイル型言語の両方ですか?

プログラミング言語 として分類される

  • 高水準言語の例 C++, Java
  • 中級言語の例C
  • 低レベル言語例 Assembly
  • いよいよ機械語としては最低レベル。

A コンパイラ は、プログラムをある言語レベルから別の言語レベルに変換するプログラムです。変換例 C++ プログラムをマシン コードに変換します。Java コンパイラは、高レベルの Java コードをバイトコード (これもマシン コードの一種) に変換します。

An 通訳 あるレベルのプログラムを別のプログラミング言語に変換するプログラムです。 同じレベル。 変換例 Java プログラムに C++

In Javaジャストインタイム コード ジェネレーターは、バイトコードを同じプログラミング レベルのネイティブ マシン コードに変換します。

したがって、 Java コンパイル言語と解釈言語の両方です。

なぜですか Java スロー?

の遅さの背後にある2つの主な理由は Java  

  1. 動的リンク: Cとは異なり、リンクは実行時に行われ、プログラムが実行されるたびに Java.
  2. 実行時インタープリター: バイトコードからネイティブマシンコードへの変換は実行時に行われる。 Java さらに速度が遅くなる

ただし、最新バージョンの Java パフォーマンスのボトルネックを大幅に解決しました。

まとめ :

  • JVMの完全な形式は Java 仮想マシン。JVM Java 駆動するエンジンです Java コード。変換します Java バイトコードをマシン言語に変換します。
  • JVMアーキテクチャ Java クラスローダー、メモリ領域、実行エンジンなどが含まれます。
  • JVMでは、 Java コードはバイトコードにコンパイルされます。このバイトコードは異なるマシンで解釈されます
  • JITはジャストインタイムコンパイラの略です。JITは Java 仮想マシン(JVM)。実行時間を短縮するために使用されます。
  • 他のコンパイラマシンと比較して、JVMは Java 実行が遅くなる可能性があります。