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

推薦する

Rushmail: 企業のマーケティングデータを機密に保つにはどうすればいいですか?一括メールプラットフォームの操作ログの分析

月給5,000~50,000のこれらのプロジェクトはあなたの将来ですインターネット時代の発展に伴い、...

midphase - 高品質のウェブホスティング、15% オフ、年間 12 ドル + 無料ドメイン名

20年近い歴史を持つUK2グループの子会社Midphaseでは、最近バーチャルホスト向けに定価より1...

企業がクラウド コンピューティングを使用する必要があるのはなぜですか?

今日のビジネスで最も重要な側面が何であるかについては人によって意見が異なりますが、ますます多くの企業...

10年後、あなたはどこにいるでしょうか?今後10年間で大きな利益をもたらす17の新興産業

[[206013]]蒸気機関、発電機、コンピュータの発明からインターネットの普及に至るまで、科学技術...

Huawei CloudのXiao Yi氏:Fusionplant 2.0は産業のデジタル化を可能にし、品質と効率を向上します

5月16日、2023年ファーウェイクラウドシティサミットの国内最初の開催地が広州に到着した。このサミ...

共同購入ウェブサイトは大規模な再編が行われており、ほとんどの小規模共同購入ウェブサイトが閉鎖されている。

共同購入が急増する一方で、共同購入の「詐欺スキャンダル」も頻繁に発生している。最近、国内トップ10の...

hostus-$13.5/768m メモリ/768MvSwap/20g ハードディスク/2T トラフィック

最近、便利なものが見つからなかったため、Hostus の低価格で安価なものをいくつか投稿します。年間...

618年以前、タオバオは「検索」に取り組み始めた

設立18年目を迎えるTaobaoは、今年に入って頻繁に変化を遂げている。これまで、タオバオモバイルア...

仮想化:歴史と現状をどう見るか

この仮想化に関するレターでは、1960 年代から今日までの仮想化の歴史を探り、現在人気の IT トレ...

ハイパースケールクラウド市場は2034年までに3.4兆ドルに達すると予想

2024年末までに評価額は2,808億米ドルに達すると予想されています。 2034 年までの 10 ...

ウェブサイトを目立たせるための 8 つのヒント

最近は個人のウェブサイトが増えており、ランキング付けがますます難しくなっています。多くのウェブサイト...

Pinduoduo は「人間の本質」を理解しているのでしょうか?

まず従業員が突然死亡し、次に従業員がビルから飛び降り、その後別の従業員が発言を理由に調査を受け、最後...

中国競売協会:タオバオにはオークション資格がなく、オンライン自動車オークションは違法

タオバオ司法オークション - オークションページ浙江省高級人民法院と淘宝網が共同で立ち上げた「司法オ...

新しいメディアの公開アカウントからトラフィックを引き寄せる5つのテクニック!

現在、「公式アカウントのメリットは薄れつつある」という声が多く聞かれる。しかし、「QuestMobi...

独創性にとって重要なのは、あなたの姿勢、粘り強さ、そして革新性です

検索エンジンがサイトのランクをどのように上げたり下げたりしても、検索エンジンの最初のページを占めるサ...