gpt4 book ai didi

java - Java 对象头中有什么?

转载 作者:IT老高 更新时间:2023-10-28 20:48:11 27 4
gpt4 key购买 nike

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

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

最佳答案

对于热点:

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

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

klass 指针32 位 架构上具有字长。在 64 位 架构上,klass 指针要么有字长,但也可以有 4 字节,如果堆地址可以编码在这些 4 字节 中.

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

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

标记词实际上有很多用途。

  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/26357186/

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