一. 问题背景

遇到一个面试题“对象的内存布局”,其中涉及对象的组成。今天了解一下Java对象组成。JVM规范一个对象由什么组成,但市面上有很多实现JVM规范的JVM虚拟机,此处以sun公司的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。Mark Word结构如下:

在这里插入图片描述
从上图可以看到,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对象占用内存的大小是8byte的倍数,因此需要把对象的大小补齐至8byte倍数。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐