web-dev-qa-db-ja.com

Javaオブジェクトヘッダー

オブジェクトヘッダーに正確に保存されているものに関する情報を教えてください。おそらくJVMに依存していることは知っていますが、少なくともHotSpotの場合はどうでしょうか?具体的に最初の行の正確な説明を探しています。

私が見つけた情報では積極的に検証できないいくつかの情報を読みました。多分あなたはそれをすべて言うOpenJDK wikiへのリンクを持っていますか?

40
alobodzk

ホットスポットの場合:

オブジェクトヘッダーは、マークワードとクラスポインターで構成されます。

マークWordにはワードサイズ(32ビットアーキテクチャでは4 byte、64ビットアーキテクチャでは8 byte)があり、

klassポインターは、32 bitアーキテクチャー上のワードサイズを持ちます。 64 bitアーキテクチャでは、クラスポインターのサイズはWordですが、ヒープアドレスをこれらの4 byteでエンコードできる場合は、4 bytesも使用できます。

この最適化は "compressed oops"と呼ばれ、オプションUseCompressedOopsで制御することもできます。

また、これに関するウィキエントリを見つけることもできます 1

マークの単語は実際には多くのことに使用されます。

  1. 1つはBiased Locking2 で、これによりHotSpotは効率的なロックを実装できます。
  2. また、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 を見つけることもできます。

48
box

次のプレゼンテーションでは、オブジェクトの内容とオブジェクトヘッダーの一般的な考え方を示します。 http://www.slideshare.net/cnbailey/memory-efficient-Java

オブジェクトの実際のヘッダーは、JVMベンダー、バージョン、およびオブジェクトタイプ固有です。

3
Chris Bailey

HotSpot sources からオブジェクトのレイアウトを見つけることができます。

ヘッダーは markOop で構成され、その後に instanceKlass へのポインター(または圧縮ポインター)が続きます。

2
apangin