オブジェクトヘッダーに正確に保存されているものに関する情報を教えてください。おそらくJVMに依存していることは知っていますが、少なくともHotSpotの場合はどうでしょうか?具体的に最初の行の正確な説明を探しています。
私が見つけた情報では積極的に検証できないいくつかの情報を読みました。多分あなたはそれをすべて言うOpenJDK wikiへのリンクを持っていますか?
ホットスポットの場合:
オブジェクトヘッダーは、マークワードとクラスポインターで構成されます。
マークWordにはワードサイズ(32ビットアーキテクチャでは4 byte
、64ビットアーキテクチャでは8 byte
)があり、
klassポインターは、32 bit
アーキテクチャー上のワードサイズを持ちます。 64 bit
アーキテクチャでは、クラスポインターのサイズはWordですが、ヒープアドレスをこれらの4 byte
でエンコードできる場合は、4 bytes
も使用できます。
この最適化は "compressed oops"と呼ばれ、オプションUseCompressedOops
で制御することもできます。
また、これに関するウィキエントリを見つけることもできます 1 。
マークの単語は実際には多くのことに使用されます。
Biased Locking
2 で、これによりHotSpotは効率的なロックを実装できます。GC to set forward pointers
およびto store the age of the objects
の間に使用されます。オブジェクトのIDハッシュコードは、マーク(System.identityHashCode
/Object.hashCode
one)内に保存できます。markOop.hpp のソースコードには、アーキテクチャに応じてレイアウトを説明するコメントがあります。
// 32 bits:
// --------
// hash:25 ------------>| age:4 biased_lock:1 lock:2 (normal object)
// JavaThread*:23 Epoch:2 age:4 biased_lock:1 lock:2 (biased object)
// size:32 ------------------------------------------>| (CMS free block)
// PromotedObject*:29 ---------->| promo_bits:3 ----->| (CMS promoted object)
//
// 64 bits:
// --------
// unused:25 hash:31 -->| unused:1 age:4 biased_lock:1 lock:2 (normal object)
// JavaThread*:54 Epoch:2 unused:1 age:4 biased_lock:1 lock:2 (biased object)
// PromotedObject*:61 --------------------->| promo_bits:3 ----->| (CMS promoted object)
// size:64 ----------------------------------------------------->| (CMS free block)
//
// unused:25 hash:31 -->| cms_free:1 age:4 biased_lock:1 lock:2 (COOPs && normal object)
// JavaThread*:54 Epoch:2 cms_free:1 age:4 biased_lock:1 lock:2 (COOPs && biased object)
// narrowOop:32 unused:24 cms_free:1 unused:4 promo_bits:3 ----->| (COOPs && CMS promoted object)
// unused:21 size:35 -->| cms_free:1 unused:7 ------------------>| (COOPs && CMS free block)
また、oopヘッダーファイル here を見つけることもできます。
次のプレゼンテーションでは、オブジェクトの内容とオブジェクトヘッダーの一般的な考え方を示します。 http://www.slideshare.net/cnbailey/memory-efficient-Java
オブジェクトの実際のヘッダーは、JVMベンダー、バージョン、およびオブジェクトタイプ固有です。
HotSpot sources からオブジェクトのレイアウトを見つけることができます。
ヘッダーは markOop で構成され、その後に instanceKlass へのポインター(または圧縮ポインター)が続きます。