当前位置: 首页 > 知识库问答 >
问题:

Java 对象标头中有什么?

齐才艺
2023-03-14

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

我读过几条信息,但我无法用我找到的信息来证实。也许你有一个OpenJDK维基的链接,说明了一切?

共有3个答案

章兴发
2023-03-14

下面的演示让您对对象内容和对象标题有一个大致的了解:http://www.slideshare.net/cnbailey/memory-efficient-java

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

西门凯康
2023-03-14

您可以从热点源中找到对象布局。

头由markOop和一个指向instanceKlass的指针(或压缩指针)组成。

后化
2023-03-14

对于热点:

对象头由一个标记字和一个klass指针组成。

标记字具有字大小(32 位体系结构上为 4 字节,64 位体系结构上为 8 字节)和

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

这种优化称为“压缩的oops”,您还可以使用选项UseCompressedOops来控制它。

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

标记词实际上用于许多事情。

  1. 一个是偏置锁定2,通过它热点可以实现有效的锁定。
  2. 它还在GC期间用于设置前向指针并存储对象的年龄。对象的身份哈希代码可以存储在标记内(系统.identit哈希代码/对象.哈希代码之一)。

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头文件。

  • 1台https://wiki.openjdk.java.net/display/HotSpot/CompressedOops
  • 2个https://wiki.openjdk.java.net/display/HotSpot/Synchronization

 类似资料:
  • 问题内容: 你能给我一些有关对象头中确切存储的信息吗?我知道,这可能取决于JVM,但也许至少对于HotSpot?我正在寻找专门针对第一行的确切描述。 我已经阅读了一些信息,这些信息无法用我找到的信息进行正面验证。也许你有指向全部内容的OpenJDK Wiki的链接? 问题答案: 对象头由一个标记词和一个klass指针组成。 所述标记字具有(字大小在32位体系结构中,在64位体系结构)和 在克拉斯指

  • 问题内容: 我正在使用Eclipse来帮助我清理一些代码以正确使用Java泛型。大多数时候,它在推断类型方面做得非常出色,但是在某些情况下,推断类型必须尽可能地通用:对象。但是Eclipse似乎给了我一个选择,可以选择对象类型还是“?”类型。 那么之间有什么区别: 和 问题答案: 匹配项的实例,但不是。假设你要编写一个接受到任何内容的映射的方法:如果你要编写 你无法提供。如果你写 有用! 在Jav

  • 问题内容: 我正在使用Eclipse来帮助我清理一些代码以正确使用Java泛型。大多数时候,它在推断类型方面做得非常出色,但是在某些情况下,推断类型必须尽可能地通用:对象。但是Eclipse似乎给了我一个选择,可以选择对象类型还是“?”类型。 那么两者之间有什么区别? 和 问题答案: 匹配项的实例,但不是。假设您要编写一个接受Strings到任何内容的映射的方法:如果您要编写 您无法提供。如果你写

  • 据我所知,基本类型是Scalar,数组是聚合的,但用户定义的类型呢?根据什么标准,我可以将它们分为两类?

  • 问题内容: 我有类GUI,因此可以创建如下对象: 和像这样的参考变量: 现在,据我所知,g2是引用GUI类的引用变量,而g1是GUI类的对象。g1和g2有什么区别?我可以将GUI类的属性与对象一起使用,但是g2的可能用法是什么? 问题答案: 参考是名称。对象就是东西。您可以为事物使用不同的名称,即使对于实际上不存在的事物也可以使用不同的名称。 您可以声明名称,而无需实际给它们任何“真实的”含义,例

  • 问题内容: 每当我学习垃圾收集器时,都会听到术语“对象图”。到底是什么意思? 问题答案: 对象具有对其他对象的引用,这些对象又可以具有对更多对象(包括起始对象)的引用。这将创建对象图,在可及性分析中很有用。例如,如果起始对象是可到达的(例如,它在线程的本地堆栈中),则图形中的所有对象都是可到达的,并且确切的垃圾收集器无法收集任何这些对象。同样,如果我们创建所有可到达对象的列表,则从一组活动对象(根