|
对打印结果,详细解释一下:
2.1、对象头(Object Header)
Object Header 是 MarkWord 和 Class Pointer 组成的,后面会详细解释。
打印结果:占用 4+4+4=12 个 bytes。
2.2、实例数据(Interface Data)
对象实例数据包括了对象的所有成员变量,其大小由各个成员变量大小决定的。
当然,不包括静态成员变量,因为它是在方法区维护的!
打印结果:可以看到 int L.i 和 boolean L.flag 就是实例数据,占用 4+1=5 个 bytes。
2.3、填充数据(Padding)
Java 对象占用空间是 8 字节对齐的,即所有 Java 对象占用 bytes 数必须是 8 的倍数,因为当我们从磁盘中取一个数据时,不会是一个字节的去读,都是按照一整块来读取的,这一块大小就是 8 个字节,所以为了完整,padding 的作用就是补充字节,保证对象是 8 字节的整数倍。
打印结果:可以看到(loss due to the next object alignment) 这个就是填充数据,占用 7个字节。
这样的话,12+5+7=24 一共是 24 个 bytes,正好是 8 的倍数。
所以说,一个对象的内存布局是由对象头、实例数据、填充数据组成的。
接下来:重点关注这个对象头。
三、细说对象头
上面提到了对象头,直接看官网上的解释,官网地址在文末:
3.1、对象头(object header)
-
object header:Common structure at the beginning of every GC-managed heap object. (Every oop points to an object header.) Includes fundamental information about the heap object's layout, type, GC state, synchronization state, and identity hash code. Consists of two words. In arrays it is immediately followed by a length field. Note that both Java objects and VM-internal objects have a common object header format.
-
翻译:在每个 gc 管理的堆对象开始处的公共结构。(每个 oop 都指向一个对象头)包括关于堆对象的布局、类型、GC 状态、同步状态和标识哈希码的基本信息。由两个词组成。在数组中,紧随其后的是长度字段。注意,Java 对象和 vm 内部对象都有一个通用的对象头格式。
3.2、Klass Point
-
The second word of every object header. Points to another object (a metaobject) which describes the layout and behavior of the original object. For Java objects, the "klass" contains a C++ style "vtable".
-
翻译:每个对象头的第二个字。指向另一个对象(元对象),该对象描述原始对象的布局和行为。对于 Java 对象,“klass”包含一个 c++风格的“虚函数表”。
3.3、Mark Word
-
The first word of every object header. Usually a set of bitfields including synchronization state and identity hash code. May also be a pointer (with characteristic low bit encoding) to synchronization related information. During GC, may contain GC state bits.
-
翻译:每个对象头的第一个字。通常是一组位域,包括同步状态和身份哈希码。也可能是同步相关信息的指针(具有低比特编码特征)。在 GC 期间,可能包含 GC 状态位。
总结一下:其实对象头就是 MarkWord 和 Klass Point 组成的。MarkWord 是用来存储对象的 hashCode、锁信息或分代年龄或 GC 标志等信息。Klass Point 是对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。
那么问题来了!!
问题:那上面说的 MarkWord 是存储的 hashcode、锁信息或分代年龄或 GC 标志是在那定义的呢?
你可以下载 OpenJDK 的源码,在 markOop.hpp 的文件中可以看到 Mark Word 的状态信息:

(编辑:南昌站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|