JVM オブジェクトの作成と場所へのアクセスのプロセスの詳細な説明
java 基本チュートリアルこのコラムでは、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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4

Spring Bootは、Java開発に革命をもたらす堅牢でスケーラブルな、生産対応のJavaアプリケーションの作成を簡素化します。 スプリングエコシステムに固有の「構成に関する慣習」アプローチは、手動のセットアップを最小化します。
