什么是在java对象头
你可以给我一些信息,什么是完全存储在对象头? 我知道,这可能是JVM的依赖,但可能至less对HotSpot? 我正在寻找第一行的确切说明。
我读了几个信息,我不能积极地validation我发现的信息。 也许你有一个OpenJDK wiki的链接,说这一切?
对于HotSpot:
对象头由一个标记字和一个klass指针组成。
标记字具有字大小(32位体系结构为8 byte
,64位体系结构为8 byte
)
klass指针在32 bit
体系结构上具有字大小。 在64 bit
体系结构中,klass指针要么具有字大小,要么能够在4 bytes
编码堆地址,也可以有4 bytes
。
这个优化被称为“压缩oops” ,你也可以使用UseCompressedOops
选项UseCompressedOops
控制它。
你也可以find关于这个1的维基条目。
标记词实际上用于许多事情。
- 一个是
Biased Locking
2 ,HotSpot通过该Biased Locking
可以实现有效的locking。 - 它也用于
GC to set forward pointers
期间GC to set forward pointers
,并to store the age of the objects
。 对象的身份哈希码可以存储在标记内(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)
你也可以在这里findoop头文件。
以下演示文稿为您提供了对象内容和对象头的一般概念: http : //www.slideshare.net/cnbailey/memory-efficient-java
任何对象的实际标题都是JVM供应商,版本和对象types特定的。
您可以从HotSpot来源find对象布局。
头由markOop组成,后跟一个指向instanceKlass的指针(或压缩指针)。