什么是在java对象头

你可以给我一些信息,什么是完全存储在对象头? 我知道,这可能是JVM的依赖,但可能至less对HotSpot? 我正在寻找第一行的确切说明。

我读了几个信息,我不能积极地validation我发现的信息。 也许你有一个OpenJDK wiki的链接,说这一切?

对于HotSpot:

对象头由一个标记字和一个klass指针组成。

标记字具有字大小(32位体系结构为8 byte ,64位体系结构为8 byte

klass指针32 bit体系结构上具有字大小。 在64 bit体系结构中,klass指针要么具有字大小,要么能够在4 bytes编码堆地址,也可以有4 bytes

这个优化被称为“压缩oops” ,你也可以使用UseCompressedOops选项UseCompressedOops控制它。

你也可以find关于这个1的维基条目。

标记词实际上用于许多事情。

  1. 一个是Biased Locking 2 ,HotSpot通过该Biased Locking可以实现有效的locking。
  2. 它也用于GC to set forward pointers期间GC to set forward pointers ,并to store the age of the objects 。 对象的身份哈希码可以存储在标记内( System.identityHashCode / Object.hashCode之一)。

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) 

你也可以在这里findoop头文件。

以下演示文稿为您提供了对象内容和对象头的一般概念: http : //www.slideshare.net/cnbailey/memory-efficient-java

任何对象的实际标题都是JVM供应商,版本和对象types特定的。

您可以从HotSpot来源find对象布局。

头由markOop组成,后跟一个指向instanceKlass的指针(或压缩指针)。