メモリ内のJavaオブジェクト、存在のまさにどのような?
このエッセイは、私たちは詳しく見ていきます。十分な深さが、私たちは場所を理解し、あなたができるように、私たちが必要とする程度に行かないかもしれません。
JVMのメモリ・モデルを初めて目:
プログラムカウンタ
VMスタックおよびネイティブメソッドスタック
ヒープ
メソッド領域(実行時定数プール)
(写真出典:https://howtodoinjava.com/java/garbage-collection/jvm-memory-model-structure-and-components/)
これは、オブジェクトはヒープメモリであるヒープ領域であり、全体のJVMのメモリ・モデルの一部です。
私たちは、地元の店を知っているし、それはそれの正確にどのように特定のメモリのですか?我々は継続します。
注意:すべての記事は、JVMのHotSpot JVM特に言われています。
非常に明確に書かれたブログを読んで、詳細、プロセス(ジャストOOP_CLASSを見て)、関連するコンテンツの書き込みは非常に明確です。15年の卒業生の兄弟への導入を読んで、アリは今、技術の専門家で、再びその真実を確認し、人々は、世界は困難である地面をワードグラウンドを持っている必要があり、多くの場合、自分の技術に反映言葉がありますキャリア、あなたはあまりにも早く言葉をそれを行うことができます。懸命に仕事を続けるために懸命に働きます。
実際には、ホットスポットのソースクラース部のターンの前に、私は再び、の深い理解を持って今日を引用していませんでした。
全体の構造を見てください:
Javaは、二つの部分のJVMオブジェクト1、オブジェクト自体であり、対応するオブジェクトクラスであり、これらのオブジェクトのoopsHierarchy.hpp JVMコード代表的に見ることができる以下のとおりです。
#ifndefのCHECK_UNHANDLED_OOPS のtypedef クラス oopDescは* OOP。 typedef クラス instanceOopDesc * instanceOop。 typedef クラス methodOopDesc * methodOop。 typedef クラス constMethodOopDesc * constMethodOop。 typedef クラス methodDataOopDesc * methodDataOop。 typedef クラス arrayOopDesc * arrayOop。 typedef クラス objArrayOopDesc * objArrayOop。 typedefのクラス typeArrayOopDesc * typeArrayOop。 typedef クラス constantPoolOopDesc * constantPoolOop。 typedef クラス constantPoolCacheOopDesc * constantPoolCacheOop。 typedefのクラス klassOopDesc * klassOop。 typedefのクラス markOopDesc * markOop。 typedef クラス compiledICHolderOopDesc * compiledICHolderOop。 #else
これらのクラスの代表は以下のとおりです。また、構造上、コメントを書いて、OOPの構造は、別々ののklassです
// のklass階層はOOP階層から分離されています。 クラスクラース; クラス instanceKlass; クラス instanceMirrorKlass; クラス instanceRefKlass; クラス methodKlass; クラス constMethodKlass; クラス methodDataKlass; クラス klassKlass; クラス instanceKlassKlass; クラス arrayKlassKlass。 クラス objArrayKlassKlass; クラス typeArrayKlassKlass。 クラス arrayKlass。 クラス objArrayKlass; クラス typeArrayKlass。 クラス constantPoolKlass; クラス constantPoolCacheKlass; クラス compiledICHolderKlass; #endifの // SHARE_VM_OOPS_OOPSHIERARCHY_HPP
あなたはすべてのオブジェクトは、仮想メソッドテーブル、独立を維持して必要なときに、なぜ独立し、容疑者のC ++などの多状態を避けるために。我々は、オブジェクトの定義を見ることができるようoopDescは、さらにMarkWordにおけるオブジェクトヘッダは、実際には、instanceKlass型のインスタンスです。示さJVM内のクラスにある情報の例。
クラスoopDesc { フレンドクラスVMStructs。 プライベート: 揮発性markOopの_mark。 // 1 MarkWordの 組合_metadata { // 2类型指针 wideKlassOop _klass。 narrowOop _compressed_klass; } _metadata。// ...省略プライベート: // オブジェクト指向におけるフィールドアドレス無効 field_base(* int型オフセット) のconst ; jbyte * byte_field_addr(int型オフセット) のconst ; jchar * char_field_addr(int型オフセット)
const ; jboolean * bool_field_addr(int型オフセット) のconst ; JINT * int_field_addr(int型オフセット) のconst ; jshort * short_field_addr(int型オフセット) のconst ; jlong * long_field_addr(int型オフセット) のconst ; jfloat * float_field_addr(int型オフセット) のconst ; jdouble * double_field_addr(int型オフセット)のconst ; アドレス *のaddress_field_addr(int型オフセット)のconst ;
これはOopDesc.hppコードであり、我々はこのようInstanceOopをしたいです
#include 「おっと/ oop.hpp 」 // アンinstanceOopは、Javaクラスのインスタンスです 。// 「新しいハッシュテーブル()」instanceOopを作成する評価します。 クラス instanceOopDesc:公共oopDesc { //省略 }。 #endifの // SHARE_VM_OOPS_INSTANCEOOP_HPP
明らかにinstanceOopDescはoopDescから継承されて参照してください。だから我々は、次のoopDescの構造を分析する必要があります。
オブジェクトヘッダ(ヘッダ)/インスタンスデータ(インスタンスデータ)/アライメントパディング(パディング)は、3つの部分:我々は、Javaオブジェクトの一部である知っています。MarkWordと指標の種類:ヘッド、ターン内のオブジェクトは2つの部分からなります。
コードは明らかに我々はマークされ、そして内部の下のさまざまな分野でのインスタンスデータが、オブジェクトヘッドの一部を見ることができます。
表されたオブジェクトを参照してくださいOopDesc、我々はそのクラスクラースはそれを見て表明しました。