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

推薦する

タオバオが様相を変え、ソーシャルショッピングガイドサイトになる

最近、百度で美麗碼や莫孤街などのキーワードを検索すると、広告欄に淘宝網の子会社である易淘.comが表...

再入荷: Xenspec: 米国無制限トラフィック VPS、月額 2.95 ドルから、1Gbps 帯域幅、40Gbps 防御内蔵

xenspec(年~)の無制限通信VPSサービスは長らく在庫切れだったようですが、最近再入荷したよう...

起業家マガジン: 謎の企業の「フラッシュセール」による評価額数百億ドルの調査

新しく設立されたモバイル電子商取引会社は、最初の資金調達ラウンドで10億人民元を調達したと主張してい...

Linode クラウド サーバーは、スナップショット バックアップやカスタム アップロード .img などの画像サービスを正式にサポートします。

6月16日、Linodeは画像サービスのサポートを正式に発表しました。このサービスは、VPSをスナッ...

過去10年間の電子商取引の振り返り:オンラインプラットフォームの受け入れは予想を上回った

タオバオがアリペイ機能を開始した後、オンラインショッピングの古いモデルが覆され、消費者のショッピング...

サーバーレス調査によると、REST APIの導入が最も一般的なユースケースであることが判明

最近、Github はサーバーレス コンピューティングに関する調査を発表し、約 600 人の Git...

電子商取引のショッピングガイドサイトはタオバオによって抑制されており、高いプロモーションコストが隠れた危険となっている

美麗碩莫谷街の開発環境は新たな変化を遂げた(写真提供:テンセントテクノロジー)テンセントテクノロジー...

Meituan Dianpingの分散データアクセス層ミドルウェアMTDDLの詳細な説明

背景2016 年第 3 四半期の初め、Meituan Takeout Order 2.0 のリリース...

あなたは本当に JVM を理解していますか? JVM のメモリ領域とその機能は何ですか?

1.0 序文前回は、.class ファイルが jvm にロードされる方法について説明しました。しかし...

Baiduのアルゴリズムは重要だが、SEO担当者はそれほど心配する必要はない

SEO Kongcheng は、Baidu のアルゴリズムにはあまり注意を払う必要がないと提案してい...

2021年中国クラウドコンピューティング市場の展望:業界変化の3つの鍵

クラウド コンピューティングの変革の瞬間が到来しました。それは、成熟した市場構造、広い将来の空間、テ...

王通:世界から見た広東企業のイノベーション

>過去6か月間、私は頻繁に広東省を訪れ、毎日さまざまな起業家と議論してきました。理解が深まるに...