JVMの基本原理の分析

JVMの基本原理の分析

[[409211]]

この記事はWeChatの公開アカウント「Geek Rebirth」から転載したもので、著者はGeek Rebirthです。この記事を転載する場合はGeek Rebirth公式アカウントまでご連絡ください。

やあみんな。私は生まれ変わったオタクのアレックスです。今日は、JVM の基本原理に関する記事を共有します。言語仮想マシンの設計原則を理解する上で役立つことを願っています。現在 C、C++、Golang、Python などを使用しているかどうかに関係なく、多くのアイデアと原則は同じであり、参照として使用できます。

たとえば、カーネル仮想マシンの eBPF アーキテクチャを分析する前に、次の操作を実行します。

詳細については、「Linux ネットワークの新技術の礎」をご覧ください。 eBPF と XDP

この記事では、

  • JVM アーキテクチャ
  • ソフトウェアコードのコンパイルと実行プロセス
  • Cコードのコンパイルと実行プロセス
  • Javaコードのコンパイルと実行プロセス
  • Java がなぜインタープリタ言語でありコンパイル言語でもあるのでしょうか?
  • Java が遅いのはなぜですか?

JVM とは何ですか?

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

JVMの仕組み

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

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

JVM アーキテクチャ

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

Java 仮想マシンアーキテクチャ

1) クラスローダー

クラス ローダーは、クラス ファイルをロードするサブシステムです。主に次の 3 つの機能を実行します。読み込み、リンク、初期化。

2) 方法領域

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

3) ヒープ

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

4) JVM言語スタック

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

5) PCレジスタ

PC レジスタには、現在実行中の Java 仮想マシン命令のアドレスが格納されます。 Java では、各スレッドには独自の独立した PC レジスタがあります。

6) ネイティブメソッドスタック

ネイティブ メソッド スタックには、ネイティブ ライブラリに依存するネイティブ コードの命令が保持されます。 Java 以外の言語で書かれています。

7) 実行エンジン

ハードウェア、ソフトウェア、または完全なシステムをテストするために使用されるソフトウェアです。テスト実行エンジンは、テスト対象の製品に関する情報を一切持ちません。

8) ネイティブメソッドインターフェース

ネイティブ メソッド インターフェイスはプログラミング フレームワークです。これにより、JVM で実行されている Java コードをライブラリやネイティブ アプリケーションから呼び出すことができるようになります。

9) ネイティブメソッドライブラリ

ネイティブ ライブラリは、実行エンジンに必要なネイティブ ライブラリ (C、C++) のコレクションです。

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

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

1) エディター – プログラムを入力するには、メモ帳を使用できます。

2) コンパイラ – 高水準言語プログラムをネイティブマシンコードに変換します。

3) リンカー – メインプログラム内のさまざまなプログラムファイル参照を結合します。

4) ローダー – セカンダリ ストレージ デバイス (ハード ディスク、フラッシュ ドライブ、CD など) からファイルを RAM にロードして実行します。コードが実行されると、読み込みは自動的に行われます。

5) 実行 – オペレーティング システムとプロセッサによって処理されるコードの実際の実行。

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

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

main で、2 つの関数 f1 と f2 を呼び出すとします。メイン関数はファイル a1.c に保存されます。

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

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

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

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

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

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

JAVA のコンパイルと実行のプロセスを見てみましょう。メイン ファイルには、f1 と f2 という 2 つのメソッドがあります。

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

コンパイラはこれら 3 つのファイルをコンパイルし、バイトコードを含む 3 つの対応する .class ファイルを生成します。 C とは異なり、リンクは行われません。 Java VM または Java 仮想マシンは RAM 上に存在します。実行中、クラス ファイルはクラス ローダーを使用して RAM に読み込まれます。バイトコードにセキュリティ上の脆弱性がないか検証されます。

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

注: JIT または Just-In-Time コンパイラは、Java 仮想マシン (JVM) の一部です。同様の機能を持つバイトコードの部分を同時に変換します。

Java がなぜインタープリタ言語でありコンパイル言語でもあるのでしょうか?

プログラミング言語は次のように分類されます

  • C++やJavaなどの高級言語
  • Cなどの中間言語
  • アセンブリなどの低水準言語
  • 最後に、最も低レベルのマシン言語があります。

コンパイラは、C++ プログラムをマシン コードに変換するなど、プログラムをあるレベルから別のレベル (通常は高レベルから低レベル) に変換するプログラムです。

Java コンパイラは、高レベルの Java コードをバイトコード (これもマシンコードの一種) に変換します。

インタプリタは、Java プログラムを C++ に変換するなど、プログラムを同じレベルの別の言語に変換するプログラムです。

Java では、Jit ジェネレーターがバイトコードを同じレベルでネイティブ マシン コードに変換するため、Java はコンパイル言語と解釈言語の両方になります。

Java が遅いのはなぜですか?

Javaが遅くなる主な理由は2つあります。

動的リンク: C とは異なり、Java ではプログラムが実行されるたびに実行時にリンクが行われます。

ランタイム インタープリター: バイトコードからネイティブ マシン コードへの変換は Java ランタイムで実行されるため、さらに速度が低下します。

ただし、最新バージョンの Java では、パフォーマンスのボトルネックはほぼ解決されています。

要約:

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

<<:  最高のPython仮想環境。

>>:  AppleがGoogle Cloudの最大のユーザーとなり、2021年の支払いは3億ドルを超えると予想

推薦する

共同購入ウェブサイトは統合を加速させ、業界トップ10が市場シェアの80%を占めている。

利用者の苦情、レイオフ、事業ラインの縮小、上級役員の辞任など、数々の混乱を経験した後、共同購入業界は...

宿題ヘルパー Kubernetes ネイティブ スケジューラ最適化の練習

スケジューリング システムの本質は、コンピューティング サービス/タスクが安定して効率的に実行できる...

B2Bウェブサイトを成功に導くための重要なポイントについて簡単に説明します。

B2Bウェブサイトも、この百度革命の影響を深刻に受けました。症状は異なりますが、一般的にウェブサイト...

Linux オペレーティング システムで VPN プロトコルを構築する方法

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています多くの外国...

AWS が AWS Wavelength を開始

AWS Wavelength は、5G ネットワークのエッジに AWS コンピューティングとストレー...

微博は、QQオンラインショッピングの販売者が預かり金の返還を要求し、テンセントが一部の販売者のQQグループを解散したと報じた。

4月2日、QQオンラインショッピングプラットフォームとJD POPプラットフォームは今晩共同で声明を...

製品ページに複数のパンくずナビゲーションを設定できますか?

パンくずナビゲーションは非常に一般的で便利なナビゲーション システムです。特に、幅広い製品を取り扱う...

DevOps 向け Kubernetes 管理ソフトウェア 7 選

新興のクラウドネイティブ環境では、Kubernetes が広く普及しています。コンテナをオーケストレ...

もう一度言います。タイポグラフィはウェブデザインの基礎です

あなたは何年もこの質問を探し続けており、夢の中でこの質問を聞くこともよくあります。そして、あなたはイ...

変革を求めるCIOに刺激を与えるクラウドコンピューティングの成功事例4つ

ポストエピデミック時代において、企業の CIO は数多くの高度なクラウド サービスを享受しています。...

Mogujieの評価額は10億ドル:ショッピングガイドウェブサイトは脇役ではなく主役になり始めている

さらに読む:物議を醸すモグジエ:変革後の8か月で評価額が10億ドル急上昇モグジエは2億ドルを超える新...

変革中にBaiduのSEOポリシーが変革に従う必要があるかどうかを合理的に検討する

Baiduは6月から継続的にアルゴリズムをアップグレードし、サービス戦略を変更してきました。当初は義...

推奨: UltraVPS-3 Euro/Xen/1g RAM/30g HDD/1T トラフィック

1G メモリを搭載した XEN VPS に月額 3 ユーロを支払うことについてどう思いますか?実は税...

PR5以上の友情リンクを取得するにはどうすればよいですか?

私はしばらくウェブサイトの仕事をしてきました。新人から初級開発者になるまでには長い時間と苦痛の過程を...