プログラマーに最も欠けているものはオブジェクトであり、プログラマーは毎日何百、何千ものオブジェクトを自分自身で作成します。しかし、あなたは本当に自分のオブジェクトを理解しているでしょうか?たとえば、次のクラス コード: 上記のコードでは、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 が一緒になってオブジェクト ヘッダーを構成します。
オブジェクト ヘッダーの後、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 がヒープ内に格納されていることがわかります。 要約すれば:
|
<<: 知っておくべきこと: VMware のホスト プロファイル
>>: テンセントクラウドはクラウドネイティブサーバーハードウェアの研究開発に注力する星星海研究所を設立
プライベート クラウドは組織に多くのメリットをもたらします。組織が適切に設計、構築、実装すれば、プラ...
現在、インターネット上には何億ものウェブサイトがあり、毎日何千ものあらゆる種類の新しいウェブサイトが...
導入トラフィック配当が徐々に消滅しつつある時代に、成長への突破口はどこにあるのでしょうか?空と地は暗...
現在、あらゆる分野の実務家は、習得すべきスキルを習得する必要があります。これらのスキルがなければ、長...
2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています近年、情報...
クラウドサーバープラットフォームの選択に関しては、誰もがよく知っているAlibaba Cloud、T...
raksmart が日本のデータセンターに VPS を新規導入しました。トラフィック制限がなく、主流...
Baidu アルゴリズムの継続的な改訂により、ウェブサイトの最適化作業はますます困難になり、最適化に...
オンラインでの収入というと、多くのウェブマスターがタオバオアフィリエイト、SEO最適化、注文受付など...
おそらくこの記事をご覧になったあなたも私と同じタオバオエージェントなのでしょう。それではおめでとうご...
[[403814]]この記事はWeChatの公開アカウント「Java Geek Technology...
ウェブサイトの最適化に取り組んでいる SEO 担当者は、ウェブサイトの効果を最大限に高めたいと考えて...
Baidu が更新されるたびに、ウェブサイトの一部が崩壊し、多くの古いウェブマスターは Baidu ...
最近、ある人から、DigitalOcean アカウントにチャージした後、VPS を作成できないと尋ね...
bgp.to ではこれまで、日本のソフトバンクデータセンターのサーバーをテストしてきました。今回は、...