学習のJVMの章 - オブジェクトを作成するプロセス

これは、スイッチ:https://www.jianshu.com/p/d2d806ca7859

1.オブジェクトを作成します

  • 新しい仮想マシン命令を受信したか否かを、クラスの基準と、このシンボルが表すクラスを確認するための基準の定数プールにおける対象シンボルは、ロードされ解析され、初期化されているか否かのコマンドをチェックします。ない場合は、クラスのロード処理を行います。
  • クラスが新しいオブジェクトにメモリを割り当てるために、仮想マシンによってロードされた後、クラスのロードが完了した後に、メモリサイズを完全に確立することができる(片を切り出しからJavaヒープメモリのサイズを決定します)。
  • 二つの分布:
    (1):ポインタ衝突:Javaヒープメモリを使用するメモリは、一方の側に、空きメモリの他方の側は、中央へのポインタがポインタを移動させることにより、指標として立っていたとしても、絶対に規則的であると仮定メモリの割り当て。
    (2):フリーリスト:Javaヒープメモリは、通常、空きメモリではなく、メモリがすでに絡み合って使用した場合、仮想マシンはメモリブロックがリストからによって提供されたレコードのリストを維持しなければなりませんメモリを割り当てるために、オブジェクトのインスタンスに割り当てられたスペースを探しています。
  • 圧縮関数の決定を終え、ガベージコレクタによって使用される場合は、通常のJavaヒープかどうか。
  • オブジェクトを作成する仮想マシンでスレッドセーフな動作ではありません、それは、オブジェクトB、メモリを割り当てるために、オブジェクトA、いないポインタを変更するのに十分な時間に表示され、メモリを割り当てるために、元のポインタを使用することができます。二つの溶液がある:
    (1):仮想マシンモードCAS障害リトライ保証アトミック更新操作と相まって、実際には、同期するように割り当てられたメモリ空間の操作は、;
    (2):メモリ割り当て操作に応じてJavaの小さな内の異なる空間に分割するスレッド、すなわちスレッドごと以前に割り当てられたヒープメモリは、ローカルバッファに割り当てられたスレッド(スレッドLoal割当バッファ、TLAB)と呼ばれます 。
  • メモリ割り当てが完了した後、オブジェクトフィールドのインスタンスを直接使用することができるJavaコードに初期値を割り当てることができない、プログラムの種類は、ゼロの値に対応し、これらのデータ・フィールドにアクセスすることができるように、メモリ空間の値をゼロに初期化される割り当てる必要があります。
  • オブジェクトを設定し、オブジェクトは、メタデータ、オブジェクトのハッシュ・コード、オブジェクト・ヘッダに格納されたオブジェクトのGC世代年齢などの情報を検索する方法、どのクラスのインスタンスです。

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

  • オブジェクトヘッダ(ヘッダ)、インスタンスデータ(インスタンスデータ)、配向パディング(パディング):メモリ・レイアウトに記憶されたオブジェクトが3分割され得ます。
  • :二つの情報を含むオブジェクトヘッダ、
    (1)そのようなハッシュコードとして、ランタイム・データ・オブジェクト自体を格納し、GC世代年齢ロック状態フラグスレッドがロックを保持して、スレッドIDバイアス、バイアスのタイムスタンプ、その32ビットおよび64ビットの仮想マシンのデータの部分の長さは、(オブジェクト独自のメモリ空間を再利用の状態に応じて、非固定データ構造)正式マークワードと呼ばれ、32ビットおよび64ビットです。
     

     

    画像

    (2):ポインタの種類、クラス・オブジェクト・メタデータへのポインタ、すなわち、仮想マシンは、オブジェクト・クラスのインスタンスであるポインタによって決定されます。
  • データの例:オブジェクトに格納された実際の重要度情報、すなわち、プログラム・コード・フィールドの内容の様々なタイプが定義します。それがダウン父親から継承された、または独自の定義をサブクラスであるかどうか、あなたは記録する必要があります。
  • アライメントパディング:必ずしも存在しないが、ホットスポットVM要求オブジェクトのサイズが8バイトの整数倍でなければならないので、ヘッド部と対象物を正確に8バイトの整数倍であるので、データがインスタンスを整列していない場合には、プレースホルダの役割を果たしていますとき、フル埋めるためにパディングを整列させることによって。

3. Accessオブジェクト指向:

  • Javaヒープ上のスタックから、特定の操作オブジェクトを参照することによって(ローカル変数テーブルのオブジェクト参照)は、基準オブジェクトへの参照のみを提供し、それは、ヒープ内のオブジェクトの位置へのアクセスを検索する方法を定義していません。オブジェクトのアクセス方法は、迅速で実装されています。
    (1):アクセスハンドル:プール・ハンドルに分割されるように、Javaヒープメモリを、リファレンス・ハンドラ・アドレスは、ハンドルは、オブジェクトインスタンスのデータと型データのそれぞれのアドレス情報を含む、オブジェクトに格納されています。
     

     

    画像

    利点:ハンドラ・アドレスに記憶されている基準は、オブジェクトが移動し、基準を変更しない場合、ハンドルだけデータポインタを変更する例安定です。
    (2)直接ポインタ(メソッド領域に格納された)基準を直接対象アドレスに格納されている、Javaヒープ場所型アクセス対象データのアドレス。
     

     

     

    利点:より速く、ポインタの位置の時間コストを節約し、ホットスポットは、直接ポインタへのアクセスです。

 

おすすめ

転載: www.cnblogs.com/123-shen/p/11345259.html