[jvm] クラスローディングサブシステム

1.写真

ここに画像の説明を挿入します

2. クラスローダーの役割
  • 1. クラス ローダー サブシステムは、ファイル システムまたはネットワークからクラス ファイルをロードする役割を果たします。
  • 2.クラスファイルには、ファイルの先頭に特定のファイル識別子があります。
  • 3.ClassLoader はクラス ファイルのロードのみを担当し、実行エンジンが実行できるかどうかを決定します。
  • 4. ロードされたクラス情報はメソッド領域のメモリ空間に格納されます。
  • 5. メソッド領域には、クラス情報の保存に加えて、実行時定数プール情報も保存されます。これには、文字列リテラルや数値定数も含まれる場合があります (定数情報のこの部分は、クラス ファイル内の定数プール部分のメモリ マッピングです)。
  • 6. 定数プール バイトコード ファイル内の定数プール構造は、動作中にメモリにロードされ、ランタイム定数プールと呼ばれます。
3. クラスローダーの役割
  • 1. クラス ファイルはローカル ハード ディスクに保存され、テンプレートとして理解できます。このテンプレートは実行中に JVM にロードされ、このテンプレートに基づいて複数の同一のインスタンスがインスタンス化されます。
  • 2. DNA メタデータ テンプレートと呼ばれるクラス ファイルが JVM にロードされ、メソッド領域に保存されます。
  • 3. クラス ファイル -> JVM -> メタデータ テンプレートで、このプロセスにはクラス ローダーがトランスポートする必要があります。
4. クラスロード処理
4.1 読み込み
4.1.1 説明
  • 1. クラスの完全修飾名を使用して、このクラスを定義するバイナリ バイト ストリームを取得します。
  • 2. このバイト ストリームで表される静的ストレージ構造をメソッド領域の実行時データ構造に変換します。
  • 3. このクラスを表す java.lang.Class オブジェクトをメモリ内に生成します。これは、メソッド領域内のこのクラスのさまざまなデータへのアクセス ポイントとして機能します。
4.1.2 .class ファイルのロード方法
  • 1. ローカル システムから直接ロードする
  • 2. ネットワーク経由で取得する、一般的なシナリオ: Web アプレット
  • 3. zip 圧縮パッケージから取得し、jar および war 形式の基礎となります
  • 4. 実行時の計算と生成。最も一般的に使用されるのは動的プロキシ テクノロジです。
  • 5. 他のファイルから生成、使用シナリオ: jsp アプリケーション
  • 6. 独自のデータベースから .class ファイルを抽出することは比較的まれです。
  • 7. 暗号化ファイルから得られる、クラスファイルの逆コンパイルを防ぐための一般的な保護手段
4.2 リンク
4.2.1 検証 (検証 [ˈverɪfaɪ])
  • 1. 目的は、クラス ファイルのバイト ストリームに含まれる情報が現在の仮想マシン要件を満たしていること、ロードされたクラスの正確性を保証し、仮想マシン自体のセキュリティを危険にさらさないことを保証することです。
  • 2. 主に、ファイル形式検証、メタデータ検証、バイトコード検証、シンボル参照検証の 4 種類の検証が含まれます。
4.2.2 準備する
  • 1. クラス変数にメモリを割り当て、クラス変数のデフォルトの初期値 (ゼロ値) を設定します。
  • 2. Final はコンパイル中に割り当てられ、準備フェーズ中に初期化が表示されるため、final で変更された static を除外します。
  • 3. インスタンス変数は初期化を行わず、クラス変数はメソッド領域に、インスタンス変数はオブジェクトとともにJavaヒープに割り当てられます。
4.2.3 解決
  • 1. 定数プール内のシンボル参照を直接参照に変換するプロセス
  • 2. 解析操作は、多くの場合、jvm の初期化が完了した後に実行されます。
  • 3. シンボリック参照は、参照されるターゲットを説明する一連のシンボルです。
  • 4. 直接参照は、ターゲットを直接指すポインタ、相対オフセット、またはターゲットを間接的に特定するハンドルです。
  • 5. 解析アクションは主に、クラスまたはインターフェイス、フィールド、クラス メソッド、インターフェイス メソッド、メソッド タイプなどを対象とします。定数プールのconstant_class_info、constant_fieldref_info、constant_methodref_infoなどに相当します。
4.3 初期化
4.3.1 説明
  • 1. 初期化フェーズは、クラス コンストラクター メソッド <clinit>() を実行するプロセスです。
  • 2. このメソッドは定義する必要はなく、クラス内のすべてのクラス変数の代入アクションと静的コード ブロック内のステートメントを自動的に収集するために、javac コンパイラによってマージされます。
  • 3. コンストラクター メソッド内の命令は、ソース ファイルに記述されている順序で実行されます。
  • 4.<clinit>() はクラスのコンストラクターとは異なります。(関連: 仮想マシンの観点からはコンストラクターは <init>() です)
  • 5. クラスに親クラスがある場合、jvm は、サブクラスの <clinit>() が実行される前に、親クラスの <clinit>() が実行されていることを確認します。
  • 6. 仮想マシンは、クラスの <clinit>() メソッドが複数のスレッドで同期的にロックされていることを確認する必要があります。
4.3.2 図 1
  • 1. クラス変数と静的コード ブロックがない場合、クラス コンストラクター メソッドは存在しません。
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します
4.3.3 図 2
  • 1. javac コンパイラは、クラス内のすべてのクラス変数の代入アクションを自動的に収集し、それらを静的コード ブロック内のステートメントとマージします。
    ここに画像の説明を挿入します
4.3.3 図 3
  • 1. コンストラクター メソッドの命令は、ソース ファイルに記述されている順序で実行されます。
  • 2. iconst_2 が iconst_3 よりも前に成功できる理由は、リンク準備プロセス中に num がクラス変数にメモリを割り当て、クラス変数のデフォルトの初期値を設定するためです。つまり、num はゼロです。
    ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/qq_32088869/article/details/132219810