JVMとは何ですか?JVMについて説明してください。 Archi構造

⚡ スマートサマリー

Java 仮想マシン(JVM)は、実行環境を提供するエンジンです。 Java これは、プラットフォームに依存しないバイトコードをネイティブマシン言語に変換するコードです。 Java ランタイム環境を有効にし、 Java一度書けばどこでも実行できる移植性。

  • 🧩 バイトコードブリッジ: その Java コンパイラは機械語ではなくバイトコードを生成し、JVMはそのバイトコードを任意のホストシステム上で解釈する。
  • 🏗️ ペース: Archi構造: JVMは、クラスローダー、メソッド領域、ヒープ、スタック、PCレジスタ、および実行エンジンを組み合わせてプログラムを実行します。
  • 🔄 コンパイルフロー: Cとは異なり、 Java リンクは不要です。クラスファイルはRAMにロードされ、検証された後、実行時に実行されます。
  • JITコンパイラ: ジャストインタイムコンパイラは、実行時にバイトコードをネイティブマシンコードに変換することで、パフォーマンスを向上させます。
  • 🐢 パフォーマンスに関する注意: 動的リンクと実行時解釈は歴史的に Java 速度は遅いが、現代のバージョンではその差はほぼ縮まっている。

JVM Archi構造

JVMとは何か Java?

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

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

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

の作業 Java 仮想マシンJVM

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

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

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

JVM Archi構造

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というファイルに格納されています。

C言語のメイン関数a1.c

関数f1はファイルa2.cに保存されています。

C言語コード関数f1 a2.c

関数f2はファイルa3.cに保存されています。

C言語コード関数f2 a3.c

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

C言語コンパイラはオブジェクトファイルを生成する

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

C言語リンカーは実行ファイル(.exeファイル)を生成します。

プログラムの実行中、ローダープログラムが a.exe をロードします。 RAM 実行のため。

Cコードローダーは実行ファイルをRAMにロードする

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

それでは、そのプロセスを見ていきましょう。 Javamain関数には、f1とf2という2つのメソッドがあります。

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

Java このコードは3つのファイルをクラスファイルにコンパイルします。

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

その Java VM、ゴールド Java 仮想マシンはRAM上に常駐します。実行時には、クラスローダーを使用してクラスファイルがRAMに読み込まれます。バイトコードはセキュリティ侵害がないか検証されます。

Java クラスローダーはクラスファイルをRAMにロードします

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

Java 実行エンジンはバイトコードをネイティブコードに変換する

注: 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は、Deeplearning4j、Weka、ApacheなどのAIおよびビッグデータフレームワークを実行します。 Sparkそのジャストインタイムコンパイラとメモリ管理により、これらのライブラリはネイティブコードを書き換えることなく、プラットフォームを問わず大規模なデータセットを効率的に処理できます。

はい。AI支援型プロファイラは、ガベージコレクションのログを分析し、ヒープサイズを提案したり、処理の遅いメソッドを特定したりできます。これにより、JVMフラグの調整やボトルネックの特定が迅速に行えますが、開発者は推奨される変更点をすべて検証する必要があります。

JVMはバイトコードを実行します。JREは、JVMを実行するために必要なコアライブラリをバンドルしています。 Java プログラム。JDKにはコンパイラやデバッガなどの開発ツールが追加されているため、アプリケーションの構築に使用されます。

バイトコードはプラットフォームに依存しませんが、JVM自体はプラットフォームに依存します。各オペレーティングシステムは独自のJVM実装を必要とします。この設計により、互換性のあるJVMがインストールされていれば、同じコンパイル済みバイトコードを実行できます。