ホームページ  >  記事  >  Java  >  JVMアーキテクチャを画像と文章で詳しく解説

JVMアーキテクチャを画像と文章で詳しく解説

高洛峰
高洛峰オリジナル
2017-03-12 09:59:281395ブラウズ

この記事では、JVM アーキテクチャを画像とテキストで詳しく説明します

JVM は、スタックアーキテクチャ に基づく抽象コンピューターであり、Java のクロスプラットフォーム解釈の基礎となる独自の命令セットとメモリ管理を備えています。または、バイトコードを実行用のネイティブ コードにコンパイルします。 Java 仮想マシンのアーキテクチャは次のとおりです。

JVMアーキテクチャを画像と文章で詳しく解説

Class File

Class File は、JVM によって実行できるバイトコードを含む、プラットフォームに依存しないバイナリ ファイルです。マルチバイトはビッグ エンディアンです。変更された UTF-8 エンコーディングを使用します。 Class ファイルは、クラスまたは インターフェース の情報を正確に記述します。以下を含みます:

  • 定数プール: 数値定数および文字列リテラル定数、クラス名、メソッド名、パラメーター、およびさまざまなシンボル などのメタデータ

  • メソッドのバイトコード命令、パラメータの数、ローカル変数、オペランドスタックの最大深さ、例外およびその他の情報

クラスローダ

クラスローダを指します。JVMはそれを次の目的で使用します。クラスの動的なロード、リンク、および初期化の初回。 JVM のデフォルトのローディング モデルは親委任モデルであり、クラス ローダー間には親子関係の階層があり、組み合わせを使用して内部的に実装されます。さらに、Servlet ロードなど、他のロード方法もあります。これは、最初に単独でロードを試行し、失敗した場合は上位ローダーに委譲します。OSGI ローダー間には依存関係のネットワークが存在します。上層と下層の区別がなく、より柔軟です。 Loading

Loadingは、Classファイルで表されるクラスまたはインターフェースを取得し、Class.

for

Name()、ClassLoaderなどのJVMメソッド領域に対応するjava.lang.Classオブジェクトを作成することです。 .loadClass() とリフレクションはクラスの読み込みをトリガーできます。クラスのロードがトリガーされると、詳細なプロセスは次のとおりです:

    クラスがロードされているかどうかを確認する
  • 上位クラスのローダーにロード要求を委任する
  • 自分で試してみる
  • を検索するクラスをロードしてください

  • ClassLoader がクラスパス内でクラスファイルを見つけられない場合、ClassNotFound
Exception

がスローされます。クラス A がクラス B を参照している場合、クラス A は正常にロードされていますが、クラスファイルが見つからない場合B をロードすると、NoClassDefFoundError がスローされます。 JVM には次のクラス ローダーがあります。

  • Bootstrap

    ClassLoader、クラス ローダーを開始し、Java コア クラス ライブラリを jrelib にロードします

  • Extension ClassLoader、クラス ローダーを拡張し、jrelibext のクラス
  • System ClassLoader、システム クラス ローダー、
  • Application

    Application クラス ローダー (アプリケーション クラス ローダー) とも呼ばれ、CLASSPATH 環境変数にクラスをロードします

  • link

    検証:クラスファイルの正確さ。
  • 準備: クラス
  • static

    フィールドにメモリを割り当て、それらをデフォルト値に初期化します。バイトコード命令は実行されません。

  • 分析: シンボル参照をメソッド領域 (ランタイム定数プール) への直接参照に変換します。
  • 初期化

クラス初期化メソッドを実行します。つまり、静的フィールドを割り当て、静的ブロックを順に実行します。彼らの

定義

に合わせて。親クラスの静的フィールドは、子クラスの静的フィールドより前に初期化されます。 この時点で、クラスまたはインターフェイスがメモリにロードされ、JVM はプロセス全体がスレッドセーフであることを保証します。プロセス全体にはインスタンス オブジェクトが関与しないことに注意してください。

実行時データ領域

  • メソッド領域: 実行時定数プール、クラスフィールドとメソッド情報、静的変数、メソッドのバイトコードを格納するスレッド共有は、ヒープの論理部分であり、この部分でのガベージコレクションが可能です。 。 JDK8 以降、Hotspot JVM はメモリのこの部分の内容を調整し、クラス メタデータの割り当てにはローカル メモリが使用され、インターンされた String とクラスの静的変数は Java ヒープに移動されたことに注意してください。

  • ランタイム定数プール: これは JVM の中核的な役割を果たします。基本的に、メソッドまたはフィールドに関しては、JVM はランタイム定数プール内の特定のメモリ アドレスを検索します。

  • ヒープ: スレッド共有、インスタンス オブジェクト、インスタンス変数、配列の保存は、ガベージ コレクションの主な領域です。

  • JVM スタック: スタック フレームを保存するために使用されるスレッド プライベート。メソッドが呼び出されるときに、スタック フレームが作成され、スタックにプッシュされます。

    • ローカル変数テーブル:0からこれとメソッドパラメータ、ローカル変数を格納します。
    • オペレーション スタック: メソッドのワークスペース。オペランド スタックとローカル変数の間でデータが交換され、中間結果が格納されます。オペランド スタックの深さはコンパイル時に決定できます。
    • フレーム データ: メソッドの戻り値、例外ディスパッチ、および現在のメソッドが配置されているクラスのランタイム定数プールへの参照。
    PC レジスタ: スレッドプライベート、現在の命令アドレスを保存し、実行後の次の命令アドレスを指します。
  • ネイティブ メソッド スタック: スレッド プライベート、ローカル メソッド情報、C または C++ スタックを保存します。
  • 実行エンジン

は、バイトコードを読み取り、変換し、実行します。 JVM はスタック アーキテクチャに基づいており、このスタックはオペランド スタックであり、バイトコード命令はそれを通じてさまざまな操作を実行します。レジスタベースの仮想マシンもあります。

    インタープリター、翻訳: バイトコードの解釈は高速ですが、実行が遅いという欠点は、各メソッド呼び出しを再変換して解釈する必要があることです。
  • JIT コンパイラー、ジャストインタイム コンパイル: プログラム内で頻繁に呼び出されるホットスポット メソッドを見つけ出し、バイトコードをローカル コードにコンパイルして、パフォーマンスを向上させます。
  • ガベージ コレクター: 無効なオブジェクトをリサイクルし、オブジェクトがリサイクル可能かどうかを判断し、さまざまなガベージ コレクション アルゴリズムを使用できます。
  • ネイティブ メソッド インターフェイスとライブラリ

JNI、ローカル メソッドの呼び出し、C/C++ ライブラリ、実行エンジンに必要なローカル メソッド ライブラリ。

概要

主流の JVM 実装には、Oracle の Hotspot JVM、JRockit、IBM の JVM が含まれます。 JVM チューニングに関しては、デフォルトで Hotspot VM を指します。これは、その人気を示しています。今日では、JVM を理解せずに Java に取り組むのは、少しレベルが低いと言えます。

高品質のコードを書きたい場合は、JVM を理解するだけでなく、チューニングやトラブルシューティングなどの完全な基本的なコンピューターの知識も必要です。実際、開発にどの言語を使用するとしても、それは構築のプロセスです。そしてあなた自身のコンピュータ知識システムを改善します。

以上がJVMアーキテクチャを画像と文章で詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。