オブジェクトメモリの割り当てとレイアウト
- 作成(新規、クローン、リフレクション、デシリアライズ)
- new->定数プールはシンボル参照を検索し、シンボル参照によって表されるクラスがロード、解決、および初期化されているかどうかを確認します。そうでない場合は、クラスのロードプロセスが実行されます
- オブジェクトの必要なメモリは、クラスのロードが完了した後で完全に決定できます。
- オブジェクトのメモリ割り当て方法は、ガベージコレクターに圧縮機能と並べ替え機能があるかどうかによって決まります。
- ポインターの衝突:ヒープメモリは完全に規則的であり、使用メモリと空きメモリは境界点としてポインターを使用します。メモリを割り当てるには、それに応じてポインタを移動するだけです。コンパクトプロセスのシリアル、parNew、およびその他のコレクター。
- 空きリスト:空きメモリアドレスを記録します。メモリの割り当てと同時にリストを更新します。cmsは、Mark-Swapアルゴリズムに基づくコレクターです。
- オブジェクトメモリ割り当てのスレッドセーフ
- メモリ割り当て時の同期-仮想マシンはCASに加えて障害再試行方法を採用
- スレッドローカル割り当てバッファ
- ヒープはスレッドの特定のメモリ空間に事前に割り当てられており、この部分はメモリを割り当てるときに最初に使用されます。
- TLABが使い果たされた場合のみ、再配布時に同期されます。
- 使用するかどうかは、-XX:+/- UserTLABパラメーターによって決定されます
- メモリレイアウト
- オブジェクトヘッダー
- MarkWord
- ハッシュコード、GC生成経過時間、ロックステータス、スレッドによって保持されているロック、バイアスされたスレッドID、バイアスされたタイムスタンプなど、オブジェクト自体のランタイムデータを格納します
- 32ビットおよび64ビット仮想マシンの32ビットおよび64ビット(圧縮ポインターなし)
- 非固定データ構造、オブジェクトステータスに応じたストレージスペースの多重化
- クラスポインター
- オブジェクトは、クラスメタデータへのポインターを指します。これは、オブジェクトがどのクラスインスタンスであるかを決定するために使用されます
- 完全にオブジェクト自体ではなく、ハンドルプールのハンドルがインスタンスデータと型データポインターの両方に保存されます
- オブジェクトがJava配列の場合、配列の長さを記録するためのスペースが必要です。これは、通常のJavaオブジェクトのメタデータ情報では決定できないためです。
- MarkWord
- データの例
- オブジェクトが実際に保存する有効な情報、つまり、さまざまなタイプの定義済みフィールドの内容
- ストレージの順序は、仮想マシンの割り当て戦略とフィールドがソースコードで定義されている順序の影響を受けます
- HotSpotのデフォルトの割り当て(同じ幅のフィールドは一緒に割り当てられます):longs / doubles、ints、shorts、chars、bytes / booleans、oops(通常のオブジェクトポインター)
- 親クラスによって定義されたフィールドがサブクラスの前にあります
- CompactFieldsパラメータの値がtrueの場合、サブクラスのより狭い変数が親クラスの変数のギャップに挿入されます
- パディングを揃える
- プレースホルダーの役割
- ホットスポットは、オブジェクトの開始アドレスは8バイトの整数倍でなければならない、つまり、オブジェクトは8バイトの整数倍でなければならないことを規定しています
- オブジェクトヘッダーは8バイトの倍数(1xまたは2x)であるため、この部分は必要に応じてインスタンスデータのギャップを埋めるためのものです
- オブジェクトヘッダー
- ターゲティングにアクセスする
- JVMはスタック上の参照データを介してヒープ上のオブジェクトを操作し、その本質はオブジェクトへの単なる参照です
- 方法は、現在の2つの主流である仮想マシンによって決定されます。
- ハンドルアクセス
- メモリはハンドルプールとしてヒープに分割され、参照はオブジェクトのハンドルアドレスを格納します
- ハンドルには、オブジェクトインスタンスデータとタイプデータのアドレス情報が含まれます
- 利点は安定性です。オブジェクトを移動すると、ハンドルのインスタンスデータアドレスのみが変更されます
- 直接ポインターアクセス(ホットスポット)
- 参照によって格納されたオブジェクトアドレス
- 対応するヒープオブジェクトは、型データ(クラスポインター)に関する情報を格納する必要があります。
- 利点は、高効率であり、ポインターの位置決めの時間を節約できます
- ハンドルアクセス