この記事はWeChatの公開アカウント「Geek Rebirth」から転載したもので、著者はGeek Rebirthです。この記事を転載する場合はGeek Rebirth公式アカウントまでご連絡ください。 やあみんな。私は生まれ変わったオタクのアレックスです。今日は、JVM の基本原理に関する記事を共有します。言語仮想マシンの設計原則を理解する上で役立つことを願っています。現在 C、C++、Golang、Python などを使用しているかどうかに関係なく、多くのアイデアと原則は同じであり、参照として使用できます。 たとえば、カーネル仮想マシンの eBPF アーキテクチャを分析する前に、次の操作を実行します。 詳細については、「Linux ネットワークの新技術の礎」をご覧ください。 eBPF と XDP この記事では、
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 つのメソッドがあります。
コンパイラはこれら 3 つのファイルをコンパイルし、バイトコードを含む 3 つの対応する .class ファイルを生成します。 C とは異なり、リンクは行われません。 Java VM または Java 仮想マシンは RAM 上に存在します。実行中、クラス ファイルはクラス ローダーを使用して RAM に読み込まれます。バイトコードにセキュリティ上の脆弱性がないか検証されます。 次に、実行エンジンはバイトコードをネイティブ マシン コードに変換します。これはジャストインタイムコンパイルであり、Java が比較的遅い主な理由の 1 つです。 注: JIT または Just-In-Time コンパイラは、Java 仮想マシン (JVM) の一部です。同様の機能を持つバイトコードの部分を同時に変換します。 Java がなぜインタープリタ言語でありコンパイル言語でもあるのでしょうか? プログラミング言語は次のように分類されます
コンパイラは、C++ プログラムをマシン コードに変換するなど、プログラムをあるレベルから別のレベル (通常は高レベルから低レベル) に変換するプログラムです。 Java コンパイラは、高レベルの Java コードをバイトコード (これもマシンコードの一種) に変換します。 インタプリタは、Java プログラムを C++ に変換するなど、プログラムを同じレベルの別の言語に変換するプログラムです。 Java では、Jit ジェネレーターがバイトコードを同じレベルでネイティブ マシン コードに変換するため、Java はコンパイル言語と解釈言語の両方になります。 Java が遅いのはなぜですか?Javaが遅くなる主な理由は2つあります。 動的リンク: C とは異なり、Java ではプログラムが実行されるたびに実行時にリンクが行われます。 ランタイム インタープリター: バイトコードからネイティブ マシン コードへの変換は Java ランタイムで実行されるため、さらに速度が低下します。 ただし、最新バージョンの Java では、パフォーマンスのボトルネックはほぼ解決されています。 要約:
|
>>: AppleがGoogle Cloudの最大のユーザーとなり、2021年の支払いは3億ドルを超えると予想
1.4.1 MVCフレームワークパターンの実装(2)ステップ 3: Controllers/Defa...
はじめに:アメリカのテクノロジーブログTechCrunchは土曜日、WatchMojoの創設者兼CE...
ショッピングや支払いでもウイルスが拡散する可能性がある。セキュリティの問題は真剣に受け止める必要があ...
Eコマースのライブストリーミングに新たな「ルーチン」が誕生しました。ライブストリーミングルームが依然...
Helmの使用は比較的簡単ですが、主にgoテンプレートのせいで、Chartパッケージを自分で開発する...
10月21日、アリババは世界初の多言語リアルタイム翻訳電子商取引ライブ放送を完了し、AIが騒がしい環...
週末、私は弊社のクライアントの 1 社の活動を体験するために現場に行きました。彼らはネイティブ ティ...
ウェブマスターにとって最も厄介なのは、ウェブサイトが降格されることです。ウェブサイトのランキングが百...
まず、私は IT 担当者でもなければ、プロのライターでもありません。Baidu が私を中傷したように...
2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますインターネ...
人材ネットワークの運営には、求職者と人材紹介会社の2つの主な利用者が存在します。オフラインのエージェ...
当社のウェブサイトにおける SEO の目的は、キーワードランキングを最適化し、検索エンジンからのトラ...
Racknerd は現在、1C、4C、8C、16C、32C セグメントでマルチ IP クラスタ サー...
最近、百度知道などの権威あるウェブサイトが外部リンクの広告を取り締まっており、どうしたらいいのか困惑...
「コンピューティングは中心からエッジへと移行している」、「コンピューティングは周辺化されている」.....