Java 对象标头中有什么?
2022-08-31 20:15:58
你能给我一些关于对象标头中确切存储的信息吗?我知道,它可能依赖于JVM,但也许至少对于HotSpot来说?我正在寻找专门针对第一行的确切描述。
我读过一些信息,我无法用我找到的信息来积极验证。也许你有一个指向OpenJDK wiki的链接,它说明了一切?
你能给我一些关于对象标头中确切存储的信息吗?我知道,它可能依赖于JVM,但也许至少对于HotSpot来说?我正在寻找专门针对第一行的确切描述。
我读过一些信息,我无法用我找到的信息来积极验证。也许你有一个指向OpenJDK wiki的链接,它说明了一切?
对于热点:
对象标头由标记字和 klass 指针组成。
标记字具有字大小(在 32 位体系结构上,在 64 位体系结构上)和4 byte8 byte
klass 指针在体系结构上具有字大小。在体系结构上,klass 指针要么具有字大小,但如果堆地址可以在这些中编码,也可以具有。32 bit64 bit4 byte4 bytes
这种优化称为“压缩的oops”,您也可以使用选项进行控制。UseCompressedOops
你也可以找到一个关于这个1的维基条目。
标记词实际上用于许多事情。
Biased LockingGC to set forward pointersto store the age of the objectsSystem.identityHashCodeObject.hashCodemarkOop.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 头文件。