51

你能给我一些关于对象头中究竟存储什么的信息吗?我知道,它可能依赖于 JVM,但至少对于 HotSpot 来说可能是这样?我正在寻找专门针对第一行的确切描述。

我已经阅读了一些我无法用我找到的信息进行肯定验证的信息。也许你有一个 OpenJDK wiki 的链接可以说明一切?

4

3 回答 3

65

对于热点:

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

标记字具有字长(在4 byte32 位架构上,8 byte在 64 位架构上)和

klass 指针在体系结构上具有字长32 bit。在64 bit体系结构上,klass 指针要么具有字长,但4 byte如果堆地址可以在这些4 bytes.

这种优化称为“compressed oops”,您也可以使用选项控制它UseCompressedOops

您还可以找到关于此1的 wiki 条目。

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

  1. 一是Biased Locking ,HotSpot通过它可以实现高效的加锁。
  2. 它也用于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)

您还可以在此处找到 oop 头文件。

于 2014-10-17T02:29:25.147 回答
4

您可以从HotSpot 源中找到对象布局。

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

于 2014-10-14T09:46:20.680 回答
4

The following presentation gives you a general idea of the object contents and the object header: http://www.slideshare.net/cnbailey/memory-efficient-java

The actual header for any object is JVM vendor, version and object type specific.

于 2014-10-14T15:51:30.940 回答