1. ロード
1. クラスの完全修飾名を使用して、このクラスを定義するバイナリ バイト ストリームを取得します。
2. このバイトストリームで表される静的ストレージ構造をメソッド領域の実行時データ構造に変換します。
3. このクラスを表す java.lang.Class オブジェクトを、メソッド領域内のこのクラスのさまざまなデータへのアクセス エントリとしてメモリ上に生成します。
2. 検証
1. ファイル形式の検証
バイト ストリームがクラス ファイル形式の仕様 に準拠しており、現在のバージョンの仮想マシンで処理できるかどうかを検証します。证 2. メタル データ検証 元 バイト コード秒 の情報の意味解析。
に記述されている情報が Java 言語仕様の要件と一致していることを確認します。 3. バイトコードの検証データ フローと制御フローの分析を通じて、プログラムのセマンティクスが正当かつ論理的であることを判断します。メタデータ情報のデータ型の 2 回目の検証の後、この段階でクラス メソッドが検証および分析され、検証されたクラスのメソッドが実行時に仮想マシンのセキュリティを危険にさらすイベントを引き起こさないことが確認されます。 。
4.シンボル参照検証クラス自体以外の情報を一致させる検証
3. 準備 クラス変数のメモリを正式に確保し、クラス変数の初期値を設定する段階です。これらの変数が使用するメモリはメソッド領域に確保されます。
現時点では、メモリ割り当てにはクラス変数 (static によって変更された変数) のみが含まれます。インスタンス変数は、クラス変数と同様に、オブジェクトのインスタンス化時にオブジェクトとともに Java ヒープに割り当てられます。クラス変数を最終的な初期化値に割り当てるのではなく、データ型のゼロ値にのみ割り当てます。
たとえば、 public static int value=123; 準備フェーズでは、値は int のゼロ値 (つまり 0) にのみ割り当てられ、123 には割り当てられません (プログラムがコンパイルされるまで 123 の値は割り当てられません)。 4. 解析
解析フェーズは、仮想マシンが定数プール内のシンボリック参照を直接参照に置き換えます。
シンボリック参照は任意の形式のリテラルにすることができ、仮想マシンによって異なる場合がありますが、それらはすべてターゲットを見つけることができ、クラスファイルで定義されます。
直接参照は、ターゲットを直接指すことができるポインター、相対オフセット、またはターゲットを間接的に見つけることができるハンドルです。
5. 初期化
定義された Java プログラム コードが実際に実行され始めるのは初期化段階です。このフェーズでは、プログラマは、プログラムによって作成された主観的な計画に従って、クラス変数およびその他のリソースを初期化します。
実際の割り当てはこの段階で行われます
、つまり、準備段階では public static int value=123 がこの段階で 123 に割り当てられます
関連する推奨事項:
のプロセスJVMによるクラスのロード 画像と文章で詳しく解説Javaにおけるクラスのロード順序の分析(面接の質問でよく使われる)
以上がjava -- クラスロードプロセスの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。