你能给我一些关于对象头中到底存储了什么的信息吗?我知道,它可能依赖于JVM,但至少对HotSpot来说是这样的吗?我正在寻找第一行的确切描述。
我读过几条信息,但我无法用我找到的信息来证实。也许你有一个OpenJDK维基的链接,说明了一切?
下面的演示让您对对象内容和对象标题有一个大致的了解:http://www.slideshare.net/cnbailey/memory-efficient-java
任何对象的实际头都是特定于JVM供应商、版本和对象类型的。
您可以从热点源中找到对象布局。
头由markOop和一个指向instanceKlass的指针(或压缩指针)组成。
对于热点:
对象头由一个标记字和一个klass指针组成。
标记字具有字大小(32 位体系结构上为 4 字节
,64 位体系结构上为 8 字节
)和
klass指针在32位
体系结构上具有字长。在64位
体系结构上,klass指针要么有字长,但如果堆地址可以用这些4字节编码,则也可以有
。
这种优化称为“压缩的oops”,您还可以使用选项
UseCompressedOops
来控制它。
您还可以找到有关此1的wiki条目。
标记词实际上用于许多事情。
一个是偏置锁定
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的可能用法是什么? 问题答案: 参考是名称。对象就是东西。您可以为事物使用不同的名称,即使对于实际上不存在的事物也可以使用不同的名称。 您可以声明名称,而无需实际给它们任何“真实的”含义,例
问题内容: 每当我学习垃圾收集器时,都会听到术语“对象图”。到底是什么意思? 问题答案: 对象具有对其他对象的引用,这些对象又可以具有对更多对象(包括起始对象)的引用。这将创建对象图,在可及性分析中很有用。例如,如果起始对象是可到达的(例如,它在线程的本地堆栈中),则图形中的所有对象都是可到达的,并且确切的垃圾收集器无法收集任何这些对象。同样,如果我们创建所有可到达对象的列表,则从一组活动对象(根