什么是java对象头文件

alo*_*dzk 41 java jvm java-memory-model object-layout jol

你能给我一些关于对象标题中存储内容的信息吗?我知道,它可能依赖于JVM,但至少可能对HotSpot有用吗?我正在寻找第一行的具体描述.

我已经阅读了一些我无法用我发现的信息验证的信息.也许你有一个指向OpenJDK维基的链接?

box*_*box 51

对于HotSpot:

对象标题由标记字和klass指针组成.

所述标记字具有(字大小4 byte在32位体系结构中,8 byte在64位体系结构)和

克拉斯指针对字大小32 bit的架构.在64 bit体系结构上,klass指针要么具有字大小,要么也可以具有4 byte堆地址可以在这些中进行编码4 bytes.

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

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

标志词实际上是使用了很多东西.

  1. 一个是Biased Locking 2,HotSpot可以通过它实现高效锁定.
  2. 它也用于GC to set forward pointersto store the age of the objects.对象的标识哈希码可以存储在标记(System.identityHashCode/ Object.hashCodeone)内.

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)
Run Code Online (Sandbox Code Playgroud)

您还可以在此处找到oop头文件.

  • "oop"代表*普通对象指针* (8认同)