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億ドルを超えると予想

推薦する

1.4.1 MVCフレームワークパターンの実装(2)

1.4.1 MVCフレームワークパターンの実装(2)ステップ 3: Controllers/Defa...

ザッカーバーグの成功の6つの要素:運とタイミングが不可欠

はじめに:アメリカのテクノロジーブログTechCrunchは土曜日、WatchMojoの創設者兼CE...

QRコード標準化プラットフォームは今年末に開始予定。敷居が低く、収益化も可能。

ショッピングや支払いでもウイルスが拡散する可能性がある。セキュリティの問題は真剣に受け止める必要があ...

低価格がなければ、Viya と Li Jiaqi はどうやってユーザーを維持するのでしょうか?

Eコマースのライブストリーミングに新たな「ルーチン」が誕生しました。ライブストリーミングルームが依然...

Helm Charts 開発の完全な例

Helmの使用は比較的簡単ですが、主にgoテンプレートのせいで、Chartパッケージを自分で開発する...

アリババAIが世界初のリアルタイム翻訳ライブ放送を実現、214言語の翻訳で今年のダブル11をサポート

10月21日、アリババは世界初の多言語リアルタイム翻訳電子商取引ライブ放送を完了し、AIが騒がしい環...

ブランドを宣伝する方法: 慎重に、そして大胆に

週末、私は弊社のクライアントの 1 社の活動を体験するために現場に行きました。彼らはネイティブ ティ...

ウェブサイトはどのようにして「ほぼ死にかけ」から「復活」したのでしょうか?

ウェブマスターにとって最も厄介なのは、ウェブサイトが降格されることです。ウェブサイトのランキングが百...

ローカルウェブサイトが繰り返しブロックされている:Baiduに別れを告げる時が来た

まず、私は IT 担当者でもなければ、プロのライターでもありません。Baidu が私を中傷したように...

どの職業にも独自の専門分野があります。さまざまなチャネルを通じてソフトテキストのプロモーションをどのように実行すればよいでしょうか?

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

人材ネットワーク運営の費用を人材紹介会社に支払わせる方法

人材ネットワークの運営には、求職者と人材紹介会社の2つの主な利用者が存在します。オフラインのエージェ...

ウェブサイトでユーザーエクスペリエンスを実現するときに避けるべき 5 つのこと

当社のウェブサイトにおける SEO の目的は、キーワードランキングを最適化し、検索エンジンからのトラ...

SEOの道がますます狭くなっている理由

最近、百度知道などの権威あるウェブサイトが外部リンクの広告を取り締まっており、どうしたらいいのか困惑...

テクノロジー界の新たなスター、エッジコンピューティングは、クラウドコンピューティングの「終焉の兆し」となるのでしょうか?

「コンピューティングは中心からエッジへと移行している」、「コンピューティングは周辺化されている」.....