クラスの初期化処理とオブジェクトの作成処理

さらに詳しく知りたい場合は、私の個人ウェブサイト「Yetong Space」をご覧ください。

インタビューは頻繁に行われるので、記録してください。

クラスの初期化プロセス

Java クラスの初期化プロセスは、次のステップに分割できます。

  • ロード: Java プログラムがクラスを使用する場合、システムはまずクラスがメモリにロードされているかどうかを確認します。そうでない場合、システムは ClassLoader を通じてクラスの .class ファイルをメモリにロードし、クラスを記述するためにヒープ領域に Class オブジェクトを作成します。
  • リンク
    • 検証: ロードが完了すると、システムはクラスのバイトコードを検証して、クラスが Java 仮想マシン仕様およびセキュリティ要件に準拠していることを確認します。主に、構文チェック、セマンティックチェック、バイトコード検証、シンボル参照検証などの内容が含まれます。
    • 準備: 検証に合格した後、システムはこのクラスの静的変数にメモリ領域を割り当て、デフォルト値を設定します。この処理はスタック領域ではなくヒープ領域で行われます。
    • 解決: 準備フェーズが完了すると、システムはクラスに対してシンボリック参照の解決を実行し、すべてのシンボリック参照を直接参照に変換します。このプロセスには、定数プール分析、クラスまたはインターフェイス分析、フィールド分析、およびメソッド分析が含まれます。
  • 初期化: 準備と解析が完了すると、システムはクラスの初期化の実行を開始します。このプロセスは、静的メンバー変数の代入や静的コード ブロックの実行などの操作を含め、コード内に出現する順序で順次実行されます。クラスの初期化は 1 回だけ実行されることに注意してください。

上記は Java クラスの初期化プロセスですが、クラスの初期化メソッドは、クラスがメモリにロードされ、使用する必要があるときにのみ実行されるため、いつでも直接呼び出すことができないことに注意してください。 。

オブジェクトの作成プロセス

Java オブジェクトを作成するプロセスは、次のステップに分けることができます。

  • クラスのロード: Java プログラムでは、特定のクラスを使用する必要がある場合、システムは ClassLoader を通じてクラスの .class ファイルをメモリにロードし、クラスを記述する Class オブジェクトを作成します。このプロセス中に、クラスは検証、解析、および初期化されます。クラスがすでにロードされている場合、このステップは実行されません。
  • メモリの割り当て: システムが new キーワードまたはリフレクション メカニズムを通じてオブジェクトを作成すると、JVM はヒープ領域内のオブジェクトに連続メモリ領域を割り当てます。ヒープ領域は共有メモリであるため、メモリの割り当て処理はガベージコレクション機構などの影響を受ける可能性があることに注意してください。
  • ゼロ値を初期化: メモリを割り当てた後、JVM はすべての属性変数 (インスタンス変数と静的変数を含む) をデフォルト値 (int 型を 0、オブジェクト型を null など) に初期化します。
  • オブジェクト ヘッダーを設定する: 各 Java オブジェクトにはオブジェクト ヘッダーがあり、オブジェクトのハッシュ値、ロック ステータスなどのオブジェクトのメタデータ情報を保存するために使用されます。オブジェクト ヘッダーを設定するとき、JVM はオブジェクトのタイプとサイズに応じて異なるレイアウト方法を選択します。
  • 構築メソッドを実行する: 上記の手順を完了すると、JVM はオブジェクトの構築メソッドを呼び出してオブジェクトを初期化し、初期値を属性変数に割り当てます。構築メソッドの実行順序は、親クラスからサブクラス、非静的メンバー変数から静的メンバー変数の順です。
  • オブジェクト参照を返す: 最後に、JVM はメモリ内のオブジェクトのアドレスをプログラムに返し、プログラムはこのアドレスを通じてオブジェクトにアクセスし、操作します。

Java でオブジェクトを作成するプロセスは通常自動的に行われ、オブジェクトの作成をトリガーするには new キーワードまたはリフレクション メカニズムを使用するだけでよいことに注意してください。同時に、Java オブジェクトの破棄はガベージ コレクターによって処理され、手動でオブジェクトを破棄する必要はありません。

おすすめ

転載: blog.csdn.net/tongkongyu/article/details/129847908