【问题标题】:What is in Java object header?Java 对象头中有什么?
【发布时间】:2014-12-09 00:47:36
【问题描述】:

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

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

【问题讨论】:

标签: java jvm java-memory-model object-layout jol


【解决方案1】:

对于热点:

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

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

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

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

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

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

  1. 一个是Biased Locking2,通过它HotSpot可以实现高效的锁定。
  2. 它也用于GC to set forward pointersto 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)

也可以找到oop头文件here

【讨论】:

    【解决方案2】:

    你可以从HotSpot sources找到对象布局。

    标头由markOop 后跟指向instanceKlass 的指针(或压缩指针)组成。

    【讨论】:

      【解决方案3】:

      以下演示文稿让您大致了解对象内容和对象标头: http://www.slideshare.net/cnbailey/memory-efficient-java

      任何对象的实际标头都是特定于 JVM 供应商、版本和对象类型的。

      【讨论】:

      • 很多读者的总体感觉可能是他们最好使用一种不会强加 GC 的语言。
      猜你喜欢
      • 2015-08-27
      • 1970-01-01
      • 2020-01-20
      • 1970-01-01
      • 1970-01-01
      • 2019-05-19
      • 1970-01-01
      • 2011-01-31
      • 2019-02-23
      相关资源
      最近更新 更多