ホームページ >Java >&#&ベース >JVM オブジェクトの作成と場所へのアクセスのプロセスの詳細な説明

JVM オブジェクトの作成と場所へのアクセスのプロセスの詳細な説明

coldplay.xixi
coldplay.xixi転載
2020-12-08 17:50:033116ブラウズ

java 基本チュートリアルこのコラムでは、JVM がオブジェクトを作成し、位置決めにアクセスするプロセスを紹介します

JVM オブジェクトの作成と場所へのアクセスのプロセスの詳細な説明

関連する無料学習の推奨事項: Java の基本チュートリアル

1. オブジェクトの作成

  • 仮想マシンは新しい命令を受け取ると、この命令が定数内でクラス シンボルを見つけることができるかどうかを確認します。 pool.reference を参照し、このシンボリック参照によって表されるクラスがロード、解決、および初期化されているかどうかを確認します。存在しない場合は、最初にクラスのロード処理を実行します。
  • クラス ロードが完了すると、仮想マシンは新しいオブジェクトにメモリを割り当てます (Java ヒープから一定サイズのメモリを分割します)。メモリ サイズはクラス ロードの完了後に完全に決定されます。
  • 2 つの割り当て方法:
    • (1): ポインタの衝突: Java ヒープ内のメモリが完全に規則的であると仮定します。つまり、使用済みメモリは片側にあり、空きメモリは片側にあります。反対側に、中央にインジケータとしてポインタが配置されており、ポインタを移動することでメモリの割り当てが行われます。
    • (2): 空きリスト: Java ヒープ内のメモリが規則的ではない場合、つまり、使用済みメモリと空きメモリがインターリーブされている場合、仮想マシンは、どのメモリ ブロックが利用可能であるかを記録するリストを維持する必要があります。 、オブジェクト インスタンスに割り当てるスペースをリストから見つけてメモリを割り当てます。
  • Java ヒープが正規かどうかは、使用するガベージ コレクターに圧縮および仕上げ機能があるかどうかによって決まります。
  • 仮想マシンでのオブジェクトの作成は、スレッド セーフな動作ではありません。オブジェクト A にメモリが割り当てられ、ポインタを変更する時間がなく、オブジェクト B が元のポインタを使用してメモリを割り当てる場合に発生する可能性があります。 。解決策は 2 つあります:
  • (1): メモリ領域を割り当てるアクションを同期します。実際、仮想マシンは更新操作のアトミック性を確保するために失敗時の再試行を伴う CAS を使用します。
  • ( 2): メモリ割り当てアクションは、スレッドごとに異なるスペースに分割されます。つまり、各スレッドは、ローカル スレッド割り当てバッファ (Thread Loal Allocation Buffer、TLAB) と呼ばれる、Java ヒープ内の小さなメモリ部分を事前に割り当てます。
  • メモリ割り当てが完了したら、オブジェクトのインスタンス フィールドが初期値を割り当てずに Java コードで直接使用できるようにするために、割り当てられたメモリ空間をゼロ値に初期化する必要があります。プログラムはこれらのフィールドにアクセスでき、データ型に対応するゼロ値。
  • オブジェクトを設定し、オブジェクトがどのクラスのインスタンスであるか、クラスのメタデータ情報の見つけ方、オブジェクトのハッシュコード、オブジェクトのGC生成年齢などをオブジェクトに格納します。ヘッダ。

2. オブジェクトのメモリ レイアウト: メモリに格納されるオブジェクトのレイアウトは、オブジェクト ヘッダー (Header)、インスタンス データ (Instance Data)、および位置合わせパディング (Padding) の 3 つの部分に分割できます。オブジェクト ヘッダーには 2 つの情報部分が含まれます。

(1): ハッシュ コード、GC 生成経過時間、ロック ステータス フラグ、スレッドが保持するロックなど、オブジェクト自体の実行時データを保存します。この部分のデータの長さは、32 ビット仮想マシンでは 32 ビット、64 ビット仮想マシンでは 64 ビットであり、正式にはマーク ワード (独自のデータを多重化した非固定データ構造) と呼ばれます。オブジェクトの状態に応じた保管)、スペース)。

#(2): 型ポインター、つまり、オブジェクトのクラス メタデータへのポインター。仮想マシンはこのポインターを使用して、オブジェクトがどのクラスであるかを判断します。の例。

  • インスタンスデータ: オブジェクトが実際に格納する有効な情報、つまりプログラムコード内で定義された各種フィールドの内容。親クラスから継承されたものであっても、サブクラス自体によって定義されたものであっても、記録する必要があります。
  • アライメント パディング: 必ずしも存在するわけではなく、プレースホルダーとして機能します。HotSpot VM では、オブジェクトのサイズが 8 バイトの整数倍である必要があり、オブジェクト ヘッダー部分は正確に 8 バイトの整数倍である必要があるため、 8バイトなので、インスタンスデータが整列していない場合は、整列パディングによって補完されます。

3. オブジェクト アクセスの位置付け: Java は、スタック上の参照データ (ローカル変数テーブル内のオブジェクト参照) を通じてヒープ上の特定のオブジェクトを操作します。参照はオブジェクトへの参照のみを指定し、検索方法や検索方法の定義は指定しません。ヒープ内のオブジェクトの場所にアクセスします。オブジェクト アクセス メソッドは Swift によって実装されます。

(1): ハンドル アクセス: Java ヒープはメモリの一部をハンドル プールとして分割します。リファレンスにはオブジェクトのハンドル アドレスが格納されます。ハンドルにはオブジェクト インスタンスのアドレス情報が含まれます。データと型データ。

利点: リファレンスには安定したハンドル アドレスが格納されるため、オブジェクトが移動すると、ハンドル内のインスタンス データ ポインタのみが変更され、リファレンスは変更されません。

(2): ダイレクトポインタ: リファレンスに格納されるのはオブジェクトアドレスそのものであり、アクセスされたオブジェクト型データ(メソッド領域に格納)のアドレスがJavaヒープに配置されます。 。

利点: 高速で、ポインターの位置決めにかかる時間のオーバーヘッドが節約されます。HotSpot は直接ポインター アクセスを使用します。

以上がJVM オブジェクトの作成と場所へのアクセスのプロセスの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjb51.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。