Java的对象组成简介
文章目录一. 问题背景二. 对象的组成2.1对象头Object Header2.1.1 Mark Word2.1.2 Klass Word(指向类的指针)2.1.3 数组长度array length2.2 实例数据Instance Data2.3 对齐填充字节padding一. 问题背景遇到一个面试题“对象的内存布局”,其中涉及对象的组成。今天了解一下Java对象组成。(以HotSpot虚拟机为例
文章目录
一. 问题背景
遇到一个面试题“对象的内存布局”,其中涉及对象的组成。今天了解一下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倍数。
更多推荐
所有评论(0)