Java对象头中有什么?

Java对象头中有什么?,java,jvm,java-memory-model,object-layout,jol,Java,Jvm,Java Memory Model,Object Layout,Jol,你能给我一些关于对象头中到底存储了什么的信息吗?我知道,它可能依赖于JVM,但至少对于HotSpot是这样吗?我正在寻找第一行的确切描述 我读过一些信息,但无法与我找到的信息进行正面验证。也许您有一个指向OpenJDK wiki的链接,说明了一切?您可以从中找到对象布局 标题由以下内容组成,后面是指向的指针(或压缩指针)。下面的演示让您大致了解对象内容和对象标题: 任何对象的实际标头都是特定于JVM供应商、版本和对象类型的。对于热点: 对象标题由标记词和klass指针组成。 标记字具有字大小(

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


我读过一些信息,但无法与我找到的信息进行正面验证。也许您有一个指向OpenJDK wiki的链接,说明了一切?

您可以从中找到对象布局


标题由以下内容组成,后面是指向的指针(或压缩指针)。

下面的演示让您大致了解对象内容和对象标题:


任何对象的实际标头都是特定于JVM供应商、版本和对象类型的。

对于热点:

对象标题由标记词和klass指针组成。

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

klass指针在
32位
体系结构上具有字大小。在
64位
体系结构上,如果堆地址可以用这些
4字节
编码,klass指针既可以有字大小,也可以有
4字节

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

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

标记词实际上用于很多事情

  • 一种是
    偏置锁定
    ,HotSpot可以通过它实现高效锁定
  • GC期间,它还用于设置前向指针
    ,并
    用于存储对象的年龄
    。对象的标识哈希代码可以存储在标记内(System.identityHashCode/
    对象.hashCode
    one)
  • 的源代码中有一条注释,根据体系结构描述布局:

    //  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头文件


    许多读者可能有这样一种总体感觉:他们最好使用一种不强制使用GC的语言。这里有一个很棒的视频课程,它以非常容易理解的方式向您介绍JVM的很多细节: