前にjvmランタイムデータ領域を紹介した後、メモリ内のデータがどのように作成され、レイアウトされ、アクセスされるかを見てみましょう
1. オブジェクトの作成
1.
オブジェクトを作成して割り当てるには、主に 2 つの方法があります: ポインタ衝突とフリー リスト
ポインタ衝突 :
ヒープ メモリが完全に規則的であると仮定すると、新しいときオブジェクトがメモリ領域を割り当てる場合は、ポインタを新しいオブジェクトの空き領域方向に移動して、必要なサイズのセクションを作成するだけで済みます。
フリーリスト
:
記憶が規則的でない場合は、どれを記録するためのリストを維持する必要がありますメモリに空きがある場合は、リストから十分な大きさの
を見つけてオブジェクト インスタンスに分割し、リストのレコードを更新します
2.
初期化
: メモリの割り当てが完了すると、仮想マシンは初期化されたメモリ空間を値 0 に初期化します これが、オブジェクトのフィールドのインスタンスが Java コードで初期化せずに使用できる理由です。 設定: その後、仮想マシンはオブジェクトに必要な設定を行います。主にクラスのメタデータ情報、オブジェクトのハッシュ値、オブジェクトヘッダーへの世代などを保存します。
init
: 上記の 2 つの手順の後、オブジェクトが作成されますが、すべてのフィールドの値は 0 のままです。最後のステップは、init メソッドを実行し、プログラマの意図に従ってオブジェクトを初期化することです上記の 3 つのステップが完了すると、オブジェクトが作成されます。
II.オブジェクトのメモリレイアウト
Up’’ オブジェクトヘッダー、インスタンスデータ、アライメントパディングの3つに分かれています
オブジェクトヘッダー:
オブジェクト内のオブジェクトヘッダーセットアップ フェーズで説明したように、セットアップ フェーズでは、一部のクラス メタデータ情報、ハッシュ値、世代年齢などがオブジェクト ヘッダーに格納されます。オブジェクトは主に、実行時データと型ポインターの 2 つの部分に分かれます。実行時データ
: 主に、上記のオブジェクト設定段階で保存されたハッシュ コード、世代情報、ロック状態識別、スレッドが保持するロックなどを保存します。型ポインタ:主にオブジェクトのクラスメタデータ、つまりオブジェクトがどのクラスのインスタンスであるかを格納するポインタです。また、オブジェクト型が配列の場合、
アライメントパディング
: ホットスポットでは、オブジェクトの開始アドレスが 8 バイトの倍数である必要があります。最初からテスオブジェクトのアドレスが整っていない場合は、整列パディングを使用して整列させます。三、オブジェクトアクセスの位置決め Javaプログラムはスタック上の参照データを介してオブジェクトインスタンスを操作するため、具体的な位置決めメソッドjvmは実装が異なります
主流の実装方法は2つあります。 : ハンドルとダイレクト ポインタを使用します
ハンドル プール:
原則: Java ヒープにハンドル プールとして領域が確保され、参照にはハンドル アドレスが格納されます。オブジェクト インスタンス データ ポインタ利点: オブジェクトが移動された場合、変更する必要があるのはハンドル プールに格納されているアドレスのみです
ダイレクト ポインタ 原則: ダイレクト ポインタが使用される場合、オブジェクトのアドレスはオブジェクトは参照に保存されます
利点: 1回の位置決めの時間が節約され、より効率的です ホットスポットはダイレクトポインタ方式を使用します
以上がJVM の高度な機能 - 2. JVM のヒープ内のオブジェクトの割り当て、レイアウト、およびアクセス プロセスの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。