JVM_07ランタイムデータエリア4オブジェクトのインスタンス化されたメモリレイアウトとアクセス場所

1.オブジェクトのインスタンス化

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

  • 新着

    • 最も一般的な方法
      バリエーション1:Xxxの静的メソッド
      バリエーション2:XxBuilder / XxoxFactoryの静的メソッド
  • クラスのnewInstance():リフレクションメソッドはnullパラメーターのコンストラクターのみを呼び出すことができ、アクセス許可はパブリックである必要があります

  • コンストラクターのnewInstance(Xxx):反射的な方法で、空のパラメーター化されたパラメーターを使用してコンストラクターを呼び出すことができ、アクセス許可の要件はありません。

  • clone()を使用する:コンストラクターを呼び出さないでください。現在のクラスはCloneableインターフェースを実装し、clone()を実装する必要があります。

  • デシリアライズを使用する:ファイルおよびネットワークからオブジェクトのバイナリストリームを取得します

  • サードパーティライブラリObjenesis

  • オブジェクトに対応するクラスがロード、リンク、初期化されているかどうかを判別します

  • オブジェクトにメモリを割り当てます

    • メモリが正常で、ポインタが衝突する場合

    • メモリが不規則な場合:

      • 仮想マシンはリストを維持する必要があります
      • 無料のリスト割り当て
  • 並行性のセキュリティ問題への対処

    • 再試行に失敗したCASを使用して、更新のアトミック性を確保します
    • 各スレッドには事前にTLABが割り当てられています
  • 割り当てられたスペースを初期化します-すべてのプロパティはデフォルト値に設定され、オブジェクトインスタンスフィールドが割り当てられていないときに直接使用できるようにします。
    オブジェクトのオブジェクトヘッダーを設定します

  • initメソッドを実行して初期化します

2.オブジェクトメモリのレイアウト

1.ヘッダー:ランタイムメタデータMarkwordおよびKlassInstanceタイプのポインター
2.インスタンスデータInstanceData3
。パディングの配置とパディング

public class CustomerTest {
    public static void main(String[] args) {
        Customer cust = new Customer();
    }
}

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

3.オブジェクトの場所にアクセスします

JVMは、スタックフレーム内のオブジェクト参照を介して内部オブジェクトインスタンスにどのようにアクセスしますか?->ポジショニング、スタック上の参照を通じてアクセス
ここに画像の説明を挿入します

1.アクセスを処理する
ここに画像の説明を挿入します

2.ダイレクトポインタ(HotSpotで採用)
ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/qq_43141726/article/details/114853569