Javaのオブジェクトモデル

メモリ内の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内のクラスにある情報の例。

コードへのリンク:https://github.com/openjdk-mirror/jdk7u-hotspot/blob/50bdefc3afe944ca74c3093e7448d6b889cd20d1/src/share/vm/oops/oopsHierarchy.hpp

クラス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、我々はそのクラスクラースはそれを見て表明しました。

おすすめ

転載: www.cnblogs.com/aquariusm/p/11201913.html