一. 问题背景

遇到一个面试题“对象的内存布局”,其中涉及对象的组成。今天了解一下Java对象组成。(以HotSpot虚拟机为例子)

此笔记仅供自己参考,如有错误请指正

参考:Java的对象头和对象组成详解

二. 对象的组成

对象的组成有3个部分:对象头实例数据对齐填充字节。其中对象头包含3个部分:Mark Word指向类的指针数组长度如果当前对象不是数组则没有此部分

2.1对象头Object Header

对象头包含3个部分:Mark Word(对象自身运行时的数据);指向类的指针数组长度如果当前对象不是数组则没有此部分

2.1.1 Mark Word

如果jvm是32位,则Mark Word是32bit;如果64位,则Mark Word是64bit。其结构如下:
Java的对象组成简介
从上图可以看到,Mark Work存储的是对象自身运行时的数据,比如:锁标志位;是否偏向锁;GC分代年龄;对象的hashCode;获取到该锁的线程的线程ID;偏向时间戳(Epoch)等等。

注:对象头有关锁标志位的信息涉及到并发编程原理,目前暂未详细了解,日后再作深入学习。

2.1.2 Klass Word(指向类的指针)

如果jvm是32bit,则Klass Word是32bit;如果jvm是64bit,则Klass Word是64bit。
Java对象存放在堆中,但其类信息存放在方法区中,所以Klass word指向该对象的类信息。

2.1.3 数组长度array length

如果当前对象是数组,才有此数组长度字段。
如果jvm是32bit,则数组长度是32bit;如果jvm是64bit,则数组长度是64bit

2.2 实例数据Instance Data

对象的实例数据就是对象在java代码中的属性(包括父类属性以及自己的属性)和值。

2.3 对齐填充字节padding

因为jvm要求Java对象占用内存的大小是8bit的倍数,因此需要把对象的大小补齐至8bit的倍数。

相关文章: