gpt4 book ai didi

java - Java对象头是什么?

转载 作者:搜寻专家 更新时间:2023-11-01 03:50:35 26 4
gpt4 key购买 nike

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

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

最佳答案

对于热点:

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

ma​​rk word 具有字大小(4 字节 在 32 位架构上,8 字节 在 64 位架构上)和

klass 指针32 位 架构上具有字长。在 64 位 架构上,klass 指针可以是字大小,但也可以是 4 字节,如果堆地址可以用这些 4 字节 编码的话.

此优化称为“压缩的 oops”,您还可以使用选项 UseCompressedOops 控制它。

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

ma​​rk word 实际上有很多用途。

  1. 一个是偏向锁定 2 HotSpot可以通过它实现高效的锁定。
  2. 它还在GC期间用于设置前向指针,以及存储对象的年龄。对象的身份哈希码可以存储在标记内(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 头文件 here .

关于java - Java对象头是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29776687/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com