JVM | Java 仮想マシンとそのアーキテクチャとは
JVM とは
Java 仮想マシン (JVM) Java コードまたはアプリケーションを駆動するためのランタイム環境を提供するエンジンです。 Java バイトコードを機械語に変換します。 JVM は Java ランタイム環境 (JRE) の一部です。他のプログラミング言語では、コンパイラは特定のシステム用のマシン コードを生成します。ただし、Java コンパイラは、Java 仮想マシンと呼ばれる仮想マシン用のコードを生成します。
JVM のしくみ
まず、Java コードがバイトコードにコンパイルされます。このバイトコードは異なるマシンで解釈されます
ホスト システムと Java ソースの間で、バイトコードは中間言語です。
Java の JVM はメモリ空間の割り当てを担当します。
<センター>
<図> フィギュア>センター>
この JVM チュートリアルでは、次のことを学びます-
- JVM アーキテクチャ
- ソフトウェア コードのコンパイルと実行プロセス
- C コードのコンパイルと実行のプロセス
- Java コードのコンパイルと実行のプロセス
- Java がインタープリター言語とコンパイル言語の両方であるのはなぜですか?
- Java が遅いのはなぜですか?
JVM アーキテクチャ
この JVM チュートリアルでは、JVM のアーキテクチャを理解しましょう。 Java の JVM アーキテクチャには、クラスローダー、メモリ領域、実行エンジンなどが含まれます。
<センター>
<図> フィギュア>センター>
1) クラスローダー
クラスローダーは、クラスファイルをロードするために使用されるサブシステムです。 3 つの主要な機能を実行します。読み込み、リンク、および初期化。
2) メソッド エリア
JVM メソッド エリアには、メタデータ、定数ランタイム プール、メソッドのコードなどのクラス構造が格納されます。
3) ヒープ
すべてのオブジェクト、関連するインスタンス変数、および配列はヒープに格納されます。このメモリは共通であり、複数のスレッド間で共有されます。
4) JVM 言語スタック
Java 言語スタックはローカル変数を格納し、それは部分的な結果です。各スレッドには、スレッドの作成と同時に作成される独自の JVM スタックがあります。メソッドが呼び出されるたびに新しいフレームが作成され、メソッド呼び出しプロセスが完了すると削除されます。
5) PC レジスター
PC レジスタには、現在実行中の Java 仮想マシン命令のアドレスが格納されます。 Java では、各スレッドに個別の PC レジスタがあります。
6) ネイティブ メソッド スタック
ネイティブ メソッド スタックは、ネイティブ ライブラリに依存するネイティブ コードの命令を保持します。 Java ではなく別の言語で書かれています。
7) 実行エンジン
これは、ハードウェア、ソフトウェア、または完全なシステムをテストするために使用されるソフトウェアの一種です。テスト実行エンジンは、テストされた製品に関する情報を持ちません。
8) ネイティブ メソッド インターフェイス
Native Method Interface はプログラミング フレームワークです。これにより、JVM で実行されている Java コードをライブラリやネイティブ アプリケーションから呼び出すことができます。
9) ネイティブ メソッド ライブラリ
ネイティブ ライブラリは、実行エンジンが必要とするネイティブ ライブラリ (C、C++) のコレクションです。
ソフトウェア コードのコンパイルと実行プロセス
ソフトウェア プログラムを作成して実行するには、次のものが必要です
1) 編集者 – プログラムを入力するには、メモ帳を使用できます
2) コンパイラ – 高言語プログラムをネイティブ マシン コードに変換する
3) リンカー – メイン プログラム内のさまざまなプログラム ファイル参照を組み合わせる。
4) ローダー – 実行のために、ハードディスク、フラッシュ ドライブ、CD などのセカンダリ ストレージ デバイスから RAM にファイルをロードする。コードを実行すると、読み込みが自動的に行われます。
5) 実行 – OS とプロセッサによって処理されるコードの実際の実行。
このような背景を踏まえて、次のビデオを参照し、JVM (Java Virtual Machine) の JVM 内部の動作とアーキテクチャについて学習してください。
ビデオにアクセスできない場合は、ここをクリックしてください
C コードのコンパイルと実行プロセス
JavaにおけるJavaのコンパイル過程を理解する。まず、C でのコンパイルとリンクのプロセスを簡単に見てみましょう。
メインで、2 つの関数 f1 と f2 を呼び出したとします。メイン関数はファイル a1.c に格納されています。
関数 f1 はファイル a2.c に保存されます
関数 f2 はファイル a3.c に保存されます
これらのファイル (a1.c、a2.c、および a3.c) はすべて、コンパイラに供給されます。その出力は、マシン コードである対応するオブジェクト ファイルです。
次のステップでは、リンカーを使用して、これらすべてのオブジェクト ファイルを 1 つの .exe ファイルに統合します。リンカーは、これらすべてのファイルをまとめて .exe ファイルを生成します。
プログラムの実行中、ローダー プログラムは実行のために a.exe を RAM にロードします。
Java VM での Java コードのコンパイルと実行
この JVM チュートリアルでは、JAVA のプロセスを見てみましょう。メインには、f1 と f2 の 2 つのメソッドがあります。
- メイン メソッドはファイル a1.java に保存されます
- f1 は a2.java としてファイルに保存されます
- f2 は a3.java としてファイルに保存されます
コンパイラは 3 つのファイルをコンパイルし、BYTE コードで構成される 3 つの対応する .class ファイルを生成します。 C とは異なり、リンクは行われません .
Java VM または Java 仮想マシンは RAM に存在します。実行中、クラス・ローダーを使用して、クラス・ファイルが RAM に取り込まれます。 BYTE コードは、セキュリティ違反がないか検証されます。
次に、実行エンジンがバイトコードをネイティブ マシン コードに変換します。これはジャストインタイムのコンパイルです。これが、Java が比較的遅い主な理由の 1 つです。
注: JIT または Just-in-time コンパイラは、Java 仮想マシン (JVM) の一部です。同時に同様の機能を持つバイト コードの一部を解釈します。
Java が解釈言語とコンパイル言語の両方である理由
プログラミング言語は次のように分類されます
- 高級言語 Ex. C++、Java
- 中級言語 Ex. C
- 低水準言語のアセンブリ
- ついに機械語として最低レベル
コンパイラ プログラムをあるレベルの言語から別のレベルの言語に変換するプログラムです。 C++ プログラムの機械語コードへの変換例。
Java コンパイラは、高レベルの Java コードをバイトコード (機械語の一種) に変換します。
通訳 あるレベルのプログラムを同じレベルの別のプログラミング言語に変換するプログラムです。 Java プログラムの C++ への変換例
Java では、ジャスト イン タイム コード ジェネレーターがバイトコードを同じプログラミング レベルのネイティブ マシン コードに変換します。
したがって、Java はコンパイル言語とインタープリター言語の両方です。
Java が遅いのはなぜですか?
Java の遅さの背後にある 2 つの主な理由は
<オール>ただし、Java の最新バージョンでは、パフォーマンスのボトルネックが大幅に解消されています。
まとめ :
- JVM の完全な形式は Java 仮想マシンです。 Java の JVM は、Java コードを駆動するエンジンです。 Java バイトコードを機械語に変換します。
- Java の JVM アーキテクチャには、クラスローダー、メモリ領域、実行エンジンなどが含まれます
- JVM では、Java コードはバイトコードにコンパイルされます。このバイトコードは別のマシンで解釈されます
- JIT は Just-in-time コンパイラの略です。 JIT は Java 仮想マシン (JVM) の一部です。実行時間を短縮するために使用されます
- 他のコンパイラ マシンと比較して、Java の JVM は実行が遅い場合があります。
Java