JVMとは
Java Virtual Machine (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) ClassLoader
クラスローダは、クラスファイルを読み込むためのサブシステムです。 クラスローダは、クラスファイルを読み込むためのサブシステムで、「読み込み」「リンク」「初期化」の3つの機能を担います。
2) メソッド領域
JVMのメソッド領域には、メタデータなどのクラス構造、定数ランタイムプール、メソッドのコードが格納されています。
3) ヒープ
すべてのオブジェクト、それに関連するインスタンス変数、および配列はヒープに格納されます。 このメモリは共通で、複数のスレッドで共有されます。
4) JVM言語スタック
Java言語スタックには、ローカル変数とその部分的な結果が格納されます。 各スレッドは独自のJVMスタックを持っており、スレッドが生成されると同時に作成されます。 新しいフレームは、メソッドが呼び出されるたびに作成され、メソッドの呼び出し処理が完了すると削除されます。
5) PCレジスタ
PCレジスタには、現在実行中のJava仮想マシン命令のアドレスが格納されています。 JavaではスレッドごとにPCレジスタが分かれています。
6) ネイティブメソッドスタック
ネイティブメソッドスタックは、ネイティブライブラリに依存するネイティブコードの命令を格納します。 Javaではなく、別の言語で書かれています。
7) 実行エンジン
ハードウェアやソフトウェア、システム全体をテストするためのソフトウェアの一種です。 テスト実行エンジンは、テストされる製品に関する情報を一切持ちません。
8) Native Method interface
Native Method Interfaceは、プログラミングフレームワークの一つです。 JVMで実行されているJavaコードが、ライブラリやネイティブアプリケーションを呼び出すことを可能にします。
9) Native Method Libraries
Native Librariesは、実行エンジンが必要とするNative Libraries(C, C++)を集めたものです。
ソフトウェア コードのコンパイル & 実行プロセス
ソフトウェア プログラムを書いて実行するためには、以下のものが必要です
1) エディター – プログラムを入力するためのものです。 メモ帳がこれに使用されるかもしれません
2) コンパイラ – 高言語プログラムをネイティブのマシンコードに変換するために
3) リンカ – メインプログラムで参照される異なるプログラムファイルを一緒に結合するために。
4) ローダー – ハードディスク、フラッシュドライブ、CDなどの二次記憶装置からファイルをRAMにロードして実行する。
5) 実行 – OS の & プロセッサによって処理されるコードの実際の実行です。
このような背景から、以下のビデオを参照して、& JVMの内部動作とJVM (Java Virtual Machine)のアーキテクチャについて学びましょう。
ビデオにアクセスできない場合はここをクリックしてください
Cコードのコンパイルと実行プロセス
Javaのコンパイルプロセスを理解するために。
mainの中で、2つの関数f1とf2を呼び出したとします。 メインの関数はファイルa1.cに格納されています。
関数f1はファイルa2.cに格納されています。c
関数f2はファイルa3に格納されています。c
これらすべてのファイル、すなわち。 a1.c、a2.c、a3.cのすべてのファイルがコンパイラに与えられます。 コンパイラの出力は、マシンコードである対応するオブジェクトファイルです。
次のステップは、リンカーの助けを借りて、これらすべてのオブジェクト ファイルを 1 つの .exe ファイルに統合することです。 リンカはこれらのファイルをまとめて、.exeファイルを生成します。
プログラムの実行中に、ローダープログラムが.exeをRAMにロードして実行します。
Java VMでのJavaコードのコンパイルと実行
さて、今回のJVMチュートリアルでは、JAVAのプロセスを見てみましょう。 あなたのmainでは、2つのメソッドf1とf2があります。
- mainメソッドは、a1.javaというファイルに格納されています
- f1は、a2.javaというファイルに格納されています
- f2は、a3.javaというファイルに格納されています。java
コンパイラは3つのファイルをコンパイルし、バイトコードで構成された対応する3つの.classファイルを生成します。 C言語とは異なり、リンクは行われません。
Java VM (Java Virtual Machine)は、RAM上に存在します。 実行時には、クラスローダを使用して、クラスファイルがRAM上に運ばれます。 BYTE コードは、セキュリティ違反がないかどうか検証されます。
次に、実行エンジンがバイトコードをネイティブのマシンコードに変換します。 これがジャスト・イン・タイム・コンパイルです。 Javaが比較的遅い主な理由の一つでもあります。
注:JIT(Just-in-time)コンパイラは、Java Virtual Machine(JVM)の一部です。 同じような機能を持つバイトコードの一部を同時に解釈します。
なぜJavaは解釈言語とコンパイル言語の両方を持つのか
プログラミング言語は次のように分類されます。 C++, Javaなど
コンパイラとは、プログラムをあるレベルの言語から別のレベルの言語に変換するプログラムのことです。 例:C++のプログラムを機械語に変換する。
javaのコンパイラは、高レベルのjavaコードをバイトコード(これもマシンコードの一種)に変換します。
インタプリタとは、あるレベルのプログラムを同じレベルの別のプログラム言語に変換するプログラムのことです。 JavaプログラムからC++への変換例
Javaでは、Just In Time Codeジェネレータにより、同じプログラミングレベルのバイトコードをネイティブのマシンコードに変換します。
したがって、Javaはコンパイル言語であると同時にインタープリタ言語でもあります。
Javaはなぜ遅いのか?
Javaが遅い理由は、主に2つあります。 C言語とは異なり、リンクはJavaでプログラムが実行されるたびにランタイムで行われます。
しかしながら、最新バージョンのJavaでは、パフォーマンスのボトルネックはかなり解消されています。
まとめ。
- JVMの正式名称はJava Virtual Machineです。 JavaのJVMは、Javaコードを駆動するエンジンです。 Javaのバイトコードを機械語に変換します。
- JavaのJVMアーキテクチャには、クラスローダ、メモリ領域、実行エンジンなどが含まれます。
- JVMでは、Javaコードがバイトコードにコンパイルされます。 このバイトコードは異なるマシン上で解釈されます
- JITはJust-in-time compilerの略です。 JITは、Java Virtual Machine (JVM)の一部です。 実行時間を短縮するために使用されます。
- 他のコンパイラマシンと比較して、JavaのJVMは実行速度が遅い場合があります。