#このチュートリアルの動作環境: Windows7 システム、Java8 バージョン、DELL G3 コンピューター。 JVM クラスのロード プロセスを理解するには、主に 2 つの質問に答える必要があります: 1. クラスはいつロードされるか? 2. クラスのロード方法。クラスのロード プロセス: 1. ロード段階、2. 検証段階、3. 主にメモリの割り当てとメソッド領域のクラス変数の初期化を行う準備段階、4. 解析段階、5. 初期化段階。コンパイラはクラスファイル内で宣言された静的代入変数と静的領域をマージしてcinitメソッドを生成し呼び出す、6.使用フェーズ、7.アンインストールフェーズ。
1. クラスロードのトリガー条件:
クラスロードのプロセスは主に 7 つに分かれています。ステージ: ロード、検証、準備、解析、初期化、使用、アンロードの 5 つのプロセスの順序が決定されており、JVM はこの順序に厳密に従う必要があります。JVM はタイミングを指定しませんただし、次の 5 つの状況ではクラスを直ちに初期化する必要があり、その前にロードを行う必要があると厳密に規定されています。 1. new、getstatic、putstatic、invokestatic の 4 つの命令に遭遇したとき、クラスが初期化されていない場合は、クラスが最初に初期化されます。 2. java.lang.reflect パッケージのメソッドを使用してクラスへのリフレクション呼び出しを行う場合、クラスが初期化されていない場合は、その初期化がトリガーされます。 3. クラスを初期化するときに、そのクラスの親クラスが初期化されていない場合は、最初にその親クラスの初期化がトリガーされます。 4. JVM を実行するには、メイン メソッドを含むメイン クラスを指定する必要があります。仮想マシンは最初にこのクラスを初期化します。 5. Jdk1.7 の動的言語サポートを使用する場合、java.lang.invoke.MethodHandle インスタンスの最終解析結果が REF_getstatic、REF_putstatic、REF_inokestatic、およびそれに対応するクラスのメソッド ハンドルである場合このメソッドハンドル このクラスの初期化は、初期化がない場合にトリガーされます。2. クラスロードプロセス
クラスロードプロセスは主にロード、検証、準備、解析、初期化、そしてアンインストールして使用してください。1. ロード:
1) 完全修飾名を使用して、クラスに対応するバイナリ バイト ストリームをロードします。主にクラスローダーを通じて実装されます。 2) バイト ストリームで表される静的ストレージ構造をメソッド領域の実行時データ構造に変換します。 3)、このクラスを表す java.lang.Class オブジェクトをメモリ内に生成します。これは、メソッド領域内の各クラスがこのクラスにアクセスするための入り口として機能します。 (ホットスポットはメソッド領域にこのクラスを生成します)。2. 検証:
1)、ファイル形式の検証: クラス ファイルのマジック バージョン番号定数が現在の仮想マシンでサポートされている範囲内であるかどうかを検証します。 。 2)、メタデータ検証: クラスのセマンティック情報が Java 言語仕様の要件を満たしているかどうかを検証します。 3)、バイトコード検証: プログラムのセマンティクスが合法で準拠していることを検証します。主に stackmapframe 構造を通じて。 4)、シンボル参照の検証: 仮想マシンはシンボル参照を直接参照に変換し、シンボル参照の完全修飾名で表されるクラスが見つかるかどうか、対応するドメインとメソッドが見つかるかどうかを検証します。を見つけることができ、アクセス許可が正当であるかどうか。3. 準備:
準備段階では主にメソッド領域のクラス変数(static修飾子で修飾)のメモリ確保と初期化を行います。ゼロ値 | データ タイプ | ゼロ値 | |
---|---|---|---|
0 | boolean | false | |
0L | float | 0.0f | |
0 | double | 0.0d | |
'\u0000' | reference | null | |
0 |
以上がJVM クラスのロード プロセスの段階は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。