仮想マシン内で Java オブジェクトはどのように見えるでしょうか?

仮想マシン内で Java オブジェクトはどのように見えるでしょうか?

[[321609]]

プログラマーに最も欠けているものはオブジェクトであり、プログラマーは毎日何百、何千ものオブジェクトを自分自身で作成します。しかし、あなたは本当に自分のオブジェクトを理解しているでしょうか?たとえば、次のクラス コード:

上記のコードでは、Foo クラスのインスタンス オブジェクトが main メソッドで new キーワードを通じて作成され、このオブジェクトは参照 foo によってポイントされます。では、静的変数 staticValue とインスタンス変数 localValue はメモリ内のどこに保存され、どのように存在するのでしょうか?

Java OOP - クラスモデル

JVM 自体は C++ で実装されています。 Java オブジェクトは C レベルのオブジェクトにどのようにマッピングされますか?

最も簡単な方法は、各 Java クラスに対して同じ構造を持つ対応する C++ クラスを生成することです。

しかし、HotSpot JVM はこれを行わず、OOP-Klass モデルを設計しました。ここでの OOP は、オブジェクトのインスタンス情報を表すために使用される Ordinary Object Pointer を指します。 Klass には、Java クラスを記述するためのメタデータとメソッド情報が含まれています。

このモデルを採用した理由は、HotSopt JVM の設計者が各オブジェクトに vtable (仮想関数テーブル) を含めることを望まなかったため、オブジェクト モデルが klass と oop に分割されたためです。 Oop には仮想関数は含まれませんが、Klass には仮想関数テーブルが含まれており、メソッドディスパッチを実行できます。

OOP-KlassモデルはOOPフレームワークとKlassフレームワークに分かれています

Klass には、Java クラスを記述するためのメタデータとメソッド情報が含まれています。

Klass は、定数プール、フィールド、メソッド、クラス名、親クラスなどのクラス メタデータを表すために使用されます。Klass オブジェクトには、仮想関数テーブル vtbl と親クラスの仮想関数テーブル klass_vtbl が含まれているため、Java オブジェクトのインスタンスの種類に応じてメソッドを分散できます。

JVM はクラス バイトコード ファイルをロードすると、メソッド領域に Klass オブジェクトを作成します。 InstanceKlass は java.lang.Class の VM レベルの表現と見なすことができますが、それらは同等ではありません。構造は次の図のようになります。

上図のすべてのグローバル変数には、主に定数プール内のシンボリック参照を直接参照、つまり実行時の実際のメモリ アドレスに変換することによって、クラス バイトコード解析フェーズ中に値が割り当てられます。

OOPは、オブジェクトのインスタンス情報を表すために使用される通常のオブジェクトポインタを指します。

すべての OOP クラスの共通の基本クラスは oopDesc クラスです。その構造は次のとおりです。

Javaでnew関数を使用してオブジェクトを作成すると、JVM内にinstanceOopDescインスタンスオブジェクトが作成されます。 Foo の localValue はこのオブジェクトに格納されます。

メモリ内の Java オブジェクトのレイアウトは、オブジェクト ヘッダー、インスタンス データ、パディングに分かれていると言われています。実際、これら 3 つの部分は、上図の oopDesc オブジェクトに対応しています。

_mark と _metadata が一緒になってオブジェクト ヘッダーを構成します。

  • 単語をマーク: 圧縮を可能にする instanceOopDesc の _mark メンバー。ハッシュ値、GC 生成年齢 (Age)、ロック状態フラグ (バイアス ロック、軽量ロック、重量ロック)、スレッドによって保持されているロック、バイアス スレッド ID、バイアス タイムスタンプなどのオブジェクトの実行時記録情報を格納するために使用されます。
  • メタデータ ポインター:instanceOopDesc の _metadata メンバーは、圧縮されていない Klass ポインター (_klass) と圧縮された Klass ポインターを表すことができるユニオンです。対応する klass ポインターは、クラスのメタデータを格納する Klass オブジェクトを指します。

オブジェクト ヘッダーの後、JVM は Foo の localValue など、Java オブジェクト内の特定のインスタンス データを入力し続けます。

Foo固有の分析

次に、記事の冒頭にあるサンプルコードに戻りましょう。 Foo.java には、staticValue と localValue という 2 つの変数が含まれています。ただし、クラスのロード フェーズ中に JVM によってメモリが割り当てられ、デフォルト値に初期化されるのは staticValue のみです。したがって、コードが 7 行目まで実行されると、次の図に示すように、Foo 情報と staticValue 値を記述するために、メモリ内のメソッド領域に Klass オブジェクトのみが作成されます。

この時点では、Foo に対応する instanceOopDesc インスタンス オブジェクトがヒープ メモリ内に作成されていないことがわかります。

コードが 9 行目まで実行され、Foo を作成するために new が呼び出されると、JVM はこのオブジェクトのインスタンスを表す instanceOopDesc オブジェクトを作成し、Mark Word に入力し、メソッド領域で作成したばかりの Klass オブジェクトにメタデータ ポインターをポイントして、インスタンス変数に入力します。また、メソッドはメイン メソッド内で実行されるため、すべての foo ポインターは仮想マシン スタックに保存され、作成された instanceOopDesc オブジェクトを指します。具体的なプロセスは以下のとおりです。


localValue がヒープ内に格納されていることがわかります。

要約すれば:

  • foo はローカル メソッドへの参照であり、仮想マシン スタックに格納されます。
  • staticValue静的変数は、クラスのロードフェーズ中にメソッド領域に保存され、値が割り当てられます。
  • オブジェクトが作成されるときに、localValue インスタンス変数が作成され、割り当てられます。
  • JVM 内の Java オブジェクトは、OOP と Klass の 2 つの部分に分かれています。 OOP オブジェクトはオブジェクト内にインスタンス データを格納し、Klass はクラス関連の情報を記述したり静的変数を格納するために使用されます。

<<:  知っておくべきこと: VMware のホスト プロファイル

>>:  テンセントクラウドはクラウドネイティブサーバーハードウェアの研究開発に注力する星星海研究所を設立

推薦する

impactvps-7 USD/オープン 4 VPS/5IP/4GB メモリ/4 コア/45GB SSD/2TB トラフィック

2003年に、impactvps(バックエンドドメイン名はsubnetlabs.com)を当サイトの...

Hengchuang Technology - 香港クラウドホスト(OpenStackクラウドアーキテクチャVPS)の簡単な評価

私は香港のデータセンターでHengchuang TechnologyからVPSを取得しました。この記...

ウェブサイトのオリジナルコンテンツが掲載されない理由と解決策

Baidu ランキングが安定しているウェブサイトには、通常 2 つの状況があります。1 つは、頻繁に...

大きな記事を掲載した小さなブログは、あなたのビジネスを即座に強化することができます

私たちは、自分自身の楽しみのためにブログを書いているのではありません。ブログを書いた後、私たちのブロ...

ウェブサイト分類ディレクトリにサイトを登録する際のヒントを共有します

分類ディレクトリとは何ですか? ウェブサイトディレクトリとは何ですか? ウェブサイト検索とは何ですか...

bigbrainglobal-$35/X3440/8g メモリ/4T ハードディスク/10T トラフィック/G ポート/IPMI/ノースカロライナ

bigbrainglobal.com は、バージニア州に拠点を置く正式に登録されたホスティング会社で...

テンセントクラウド、広東ホテルグループ、ハッチスマートが戦略的合意に達し、スマートホテルの新たな章を開く

6月22日、テンセントクラウド、広東国際ホテル管理グループ(以下、「広東ホテルグループ」)およびハッ...

「プロデュース101」はどのようにしてヒットオンラインバラエティ番組になったのでしょうか?

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています中国のガー...

テンセントと新浪はソーシャル電子商取引分野への参入を望んでいる。今年はこの業界で激しい競争の時期になるかもしれない。

利用者数、訪問数、資金調達などでリードするソーシャル電子商取引が頻繁に話題となると、インターネット大...

raksmart: 100M 帯域幅、香港専用サーバー/香港クラスターサーバー、月額 123 ドルから、3 つのネットワークへの直接接続 (実名は不要、匿名)

raksmart 香港データセンターには、香港独立サーバーや香港クラスターサーバーなど、10M、20...

10月1日までにゲームライセンスを申請していないゲームが店頭から撤去される問題について、どのようにお考えですか?

国家新聞出版広電総局が今年6月2日に「ゲーム出版サービスの管理に関する通知」(以下、「通知」という)...

タイトルの効果を最大化する6つの方向性

ウェブサイトのタイトル キーワードはサイト ページの重要な情報であり、検索エンジンでのサイトの可視性...

Spartanhostはどうですか?ダラスデータセンターのAMD Ryzen 9 7950XシリーズVPSの簡単なレビュー

Spartanhost のダラス データ センターは長い間非アクティブでしたが、ブラック フライデー...

嘔吐血共有外部リンク知識マニュアル

外部リンクの構築は非常に重要なタスクです。ウェブサイトの最適化のプロセスでは、ウェブサイトのコンテン...