Java 对象标头中有什么?

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

我读过一些信息,我无法用我找到的信息来积极验证。也许你有一个指向OpenJDK wiki的链接,它说明了一切?


答案 1

对于热点:

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

标记字具有字大小(在 32 位体系结构上,在 64 位体系结构上)和4 byte8 byte

klass 指针在体系结构上具有字大小。在体系结构上,klass 指针要么具有字大小,但如果堆地址可以在这些中编码,也可以具有。32 bit64 bit4 byte4 bytes

这种优化称为“压缩的oops”,您也可以使用选项进行控制。UseCompressedOops

你也可以找到一个关于这个1的维基条目。

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

  1. 一个是2,通过它,HotSpot可以实现有效的锁定。Biased Locking
  2. 它也在 和 期间使用。对象的身份哈希代码可以存储在标记(/one)内。GC to set forward pointersto store the age of the objectsSystem.identityHashCodeObject.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 头文件。


答案 2

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

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


推荐