JVMの注意3:HotSpot仮想マシン管理オブジェクト

本論文では、Javaヒープ割り当てられたオブジェクト、アクセスおよびレイアウトの知識を記録するために使用されます。

オブジェクトの作成

作成プロセスの一般的な目的は、以下に要約されています

  • クラスがすでにロードされているかどうかをチェックし、クラスのロードプロセスがロードされていない実行
  • メモリが割り当てにポインタの衝突を使用して構成されている場合は、オブジェクトのメモリに割り当てられた、不規則な使用メモリは、サイズの要件を満たし見つけるためのフリーリスト
    の並行メモリ割り当て問題:でCASを使用して最適化した後、同期するために割り当てられたメモリの操作、仮想マシンを失敗TLABは、あなただけの時間が不足することができれば、原子性を保証するためのメカニズムを再試行のみを同期させる新しいスレッドTLABを割り当てる必要があります。

    TLAB:+/- UseTLABを設定するかどうか:スレッドローカルバッファと呼ばれるヒープメモリ上に予め割り当てられたの小片は、あなたが-XXことができたときにスレッドを作成します

  • TLABが、TLABの作成にこのステップを進めることが可能である場合に割り当てられたメモリは、ゼロ値に設定されています
  • オプションのモニタオブジェクトを生成しながら、設定オブジェクトヘッダ情報
  • 意志に従い、プログラマのinitメソッド、クラス初期化情報

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

オブジェクトヘッダ(ヘッダ)、インスタンスデータ(インスタンスデータ)とアライメントパディング(パディング)のHotSpot VMにおいて、メモリ・レイアウトに記憶されたオブジェクトは、3つの領域に分割されてもよいです。

オブジェクトヘッダ

タイプおよびランタイムデータポインタ:HotSpot VMのオブジェクトヘッダは、2つの情報を含みます。

  • ランタイムデータ:そのようなハッシュコード(ハッシュコード)として、ランタイム・データ・オブジェクト自体を格納するために、GC世代年齢ロック状態フラグスレッドがロックを保持して、スレッドIDバイアス、バイアスタイムスタンプ、異なるロック状態に応じて異なる構造。
  • 型ポインタ:そのクラスのメタデータであるオブジェクトへのポインタは、仮想マシンは、オブジェクト・クラスのインスタンスであるポインタによって決定されます。(必ずしもすべての仮想マシンの実装では、オブジェクトのメタデータは、参照オブジェクトの場所にアクセスできるオブジェクト自体を通過する必要がいないことが判明、つまり、オブジェクト上のポインタのデータ型を保持しなければならない)
    ことを、オブジェクトがJava配列がある場合仮想マシンは、通常のJavaによってJavaオブジェクトのサイズを決定することができるため、オブジェクトヘッダにおいても、データ記録の配列の長さを有していなければならないメタデータ情報オブジェクトが、メタデータアレイからアレイのサイズを決定することができません。

データの例

有効データ部分の例は、フィールドの内容のプログラムコードの様々なタイプが定義され、実際のターゲット情報に格納されています。それがダウンし、親クラスから継承された、またはサブクラスで定義されているかどうか、あなたは記録する必要があります。HotSpot VMのデフォルトの割り当てポリシーのlong型/ダブル、int型、ショートパンツ/文字、バイト/ブール、OOPは、それが割り当てポリシーから見ることができ、同じ幅フィールドは常に一緒に割り当てられています。

アライメントパディング

HotSpot VMの要求オブジェクト開始アドレスは、8バイトの整数倍でなければならないことである、オブジェクトのサイズは、8バイトの整数倍でなければなりません。ヘッド部と対象物を正確に8バイト(1または2回)の倍数であり、オブジェクト・インスタンス・データの部分が整列されていない場合、したがって、それはパディングを整列させることによって完了する必要があります。

オブジェクトアクセスのポジショニング

Javaプログラムは、スタック上の特定の参照データによってヒープ上のオブジェクトを操作する必要があります。アクセス方法オブジェクトは、仮想マシンの実装に依存して、ハンドルと2回の主流の直接ポインタアクセスの使用があります。
ハンドル、ポインタへのポインタとして自体は変化しないポインタの指示対象を維持するために変化し、オブジェクトのハンドルを理解することができ、オブジェクトへのポインタ、メモリアドレスを表すオブジェクト。

  • ハンドル:プール・ハンドルなどのJavaヒープメモリパーティションハンドラのアドレスは、オブジェクト参照を格納し、ハンドルが各データ型データオブジェクトインスタンスの特定のアドレス情報が含まれています。
    利点:リファレンスオブジェクトが移動した際の基準自体を変更する必要はありませんが唯一、(ガベージコレクションは非常に一般的な行動があるときにオブジェクトを移動する)は、ハンドル内のインスタンスデータポインタを変更するストレージハンドラアドレスで安定しています。
  • 直接ポインタ:あなたはダイレクトアクセスポインタを使用する場合は、Javaヒープ内のオブジェクトのレイアウトは、データアクセスのタイプに配置する方法の関連情報を考慮しなければならない、と直接参照されたオブジェクトのアドレスが格納されています。
    利点:より速く、ポインタの位置の時間コストを節約します。このような費用が加算さそう後に非常に頻繁にJavaでアクセスオブジェクト、非常に印象的な実行コストです。(このようなホットスポットとして)

おすすめ

転載: www.cnblogs.com/NotNil/p/11542679.html