JVMとは何ですか?JVMについて説明してください。 Archi構造
⚡ スマートサマリー
Java 仮想マシン(JVM)は、実行環境を提供するエンジンです。 Java これは、プラットフォームに依存しないバイトコードをネイティブマシン言語に変換するコードです。 Java ランタイム環境を有効にし、 Java一度書けばどこでも実行できる移植性。

JVMとは何か Java?
Java 仮想マシン (JVM) は、実行環境を提供するエンジンであり、 Java コードまたはアプリケーションを変換します。 Java バイトコードを機械語に変換する。JVMは Java ランタイム環境 (JRE)。他のプログラミング言語では、コンパイラは特定のシステム用のマシンコードを生成します。しかし、 Java コンパイラは、仮想マシンと呼ばれるもの用のコードを生成します。 Java 仮想マシン。
JVMはどのように動作するのでしょうか?
まず、 Java コードはバイトコードにコンパイルされます。このバイトコードは、異なるマシンで解釈されます。ホストシステムと Java ソースコードでは、バイトコードは中間言語です。JVMでは Java メモリ空間の割り当てを担当します。
の作業 Java 仮想マシン (JVM)
ArchiJVMのアーキテクチャ(Java 仮想マシン)
それでは、JVMのアーキテクチャを理解しましょう。JVMのアーキテクチャは Java クラスローダー、メモリ領域、実行エンジンなどが含まれています。
Java 仮想マシン Archi構造
1) クラスローダー
クラスローダーは、クラスファイルをロードするために使用されるサブシステムです。クラスローダーは、ロード、リンク、初期化という3つの主要な機能を実行します。
2) メソッドエリア
JVMメソッド領域には、メタデータ、定数ランタイムプール、メソッドのコードなどのクラス構造が格納されます。
3) ヒープ
すべて オブジェクト、それらに関連するインスタンス変数、および配列はヒープに保存されます。 このメモリは共通であり、複数のスレッド間で共有されます。
4) JVM言語スタック
Java 言語スタックには、ローカル変数とその部分的な結果が格納されます。各スレッドは独自のJVMスタックを持ち、スレッドの作成と同時に作成されます。メソッドが呼び出されるたびに新しいフレームが作成され、メソッド呼び出し処理が完了すると削除されます。
5) PCレジスタ
PCレジスタには、 Java 現在実行中の仮想マシン命令。 Java各スレッドはそれぞれ独立したPCレジスタを持っています。
6) ネイティブメソッドスタック
ネイティブメソッドスタックには、ネイティブライブラリに依存するネイティブコードの命令が格納されます。これは、 Java.
7) 実行エンジン
実行エンジンはバイトコードを読み込み、それを部分的に実行します。バイトコードをネイティブマシンコードに変換して実行するために、インタプリタとジャストインタイム(JIT)コンパイラを使用します。
8) ネイティブメソッドインターフェース
ネイティブメソッドインターフェースはプログラミングフレームワークです。 Java JVM上で実行されるコードで、ネイティブアプリケーションやライブラリを呼び出し、またそれらから呼び出される。
9) ネイティブメソッドライブラリ
Native Libraries はネイティブライブラリ (C、 C++) は実行エンジンで必要になります。
ソフトウェア Code コンパイルおよび実行プロセス
ソフトウェアプログラムを作成して実行するには、以下のものが必要です。
- 1) 編集者 プログラムを入力するには、メモ帳などが使えます。
- 2) コンパイラ – 高水準言語で作成したプログラムをネイティブマシンコードに変換します。
- 3) リンカー メインプログラム内の複数のプログラムファイル参照を結合するため。
- 4) ローダー ハードディスク、フラッシュドライブ、CDなどの二次記憶装置からファイルをRAMにロードして実行します。ロードはコードの実行時に自動的に行われます。
- 5) 実行 ―コードの実際の実行は、OSとプロセッサによって処理されます。
この背景を踏まえ、次のビデオを参照して、JVM の内部動作と JVM のアーキテクチャを学びます (Java 仮想マシン)。
詳しくはこちら こちら ビデオにアクセスできない場合
C コードのコンパイルと実行プロセス
を理解する Java コンパイルプロセスについてですが、まずC言語のコンパイルとリンクのプロセスを簡単に見ていきましょう。
main関数内でf1とf2という2つの関数を呼び出しているとします。main関数はa1.cというファイルに格納されています。
関数f1はファイルa2.cに保存されています。
関数f2はファイルa3.cに保存されています。
これらのファイル、つまりa1.c、a2.c、a3.cはすべてコンパイラに入力され、コンパイラの出力は対応するオブジェクトファイル、すなわちマシンコードです。
次のステップは、リンカーの助けを借りて、これらのオブジェクトファイルをすべて1つの.exeファイルに統合することです。リンカーはこれらのファイルをすべてまとめて.exeファイルを生成します。
プログラムの実行中、ローダープログラムが a.exe をロードします。 RAM 実行のため。
Java コードのコンパイルと実行 Java VM
それでは、そのプロセスを見ていきましょう。 Javamain関数には、f1とf2という2つのメソッドがあります。
- メインメソッドはファイルa1.javaに格納されています。
- f1 は a2.java としてファイルに保存されます
- f2 は a3.java としてファイルに保存されます
コンパイラは3つのファイルをコンパイルし、バイトコードで構成される対応する3つの.classファイルを生成します。 C言語とは異なり、リンク処理は行われません。
その Java VM、ゴールド Java 仮想マシンはRAM上に常駐します。実行時には、クラスローダーを使用してクラスファイルがRAMに読み込まれます。バイトコードはセキュリティ侵害がないか検証されます。
次に、実行エンジンがバイトコードをネイティブマシンコードに変換します。これがジャストインタイムコンパイルです。これが主な理由の1つです。 Java 比較的遅いです。
注: JIT、つまりジャストインタイムコンパイラは、 Java 仮想マシン(JVM)。これは、同様の機能を持つバイトコードの一部を同時に解釈します。
なぜですか Java 解釈型言語とコンパイル型言語の両方ですか?
プログラミング言語 以下のように分類されます。
- より高度な言語、例: C++, Java
- 中級レベルの言語、例:C
- 低レベル言語、例: Assembly
- 最後に、機械語としての最低レベル
A コンパイラ は、ある言語レベルのプログラムを別の言語レベルに変換するプログラムです。たとえば、 C++ プログラムを機械語に変換する。 Java コンパイラは高レベルの Java コードをバイトコード(これも機械語の一種)に変換する。
An 通訳 あるレベルのプログラムを別のプログラミング言語に変換するプログラムです。 同じレベル例えば、 Java プログラムに C++.
In Javaジャストインタイムコードジェネレータはバイトコードをネイティブマシンコードに変換します。これらは同じプログラミングレベルです。したがって、 Java コンパイル型言語であると同時に、インタプリタ型言語でもある。
なぜですか Java スロー?
の遅さの背後にある2つの主な理由は Java には次の値があります:
- 動的リンク: Cとは異なり、リンクは実行時に行われ、プログラムが実行されるたびに Java.
- 実行時インタープリター: バイトコードからネイティブマシンコードへの変換は実行時に行われる。 Javaこれにより、速度がさらに低下する。
しかし、最新バージョンでは Java これらのパフォーマンス上のボトルネックは、かなりの部分で解消されました。











