前言
- new一个对象(如new Object()),占多少空间?
- 一个对象由哪些部分构成?
对象在堆内存中的存储布局
在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。
对象头
- 对象头分为对象标记(markOop)和类元信息(klassOop),类元信息存储的是指向该对象类元数据(klass)的首地址。
提问:一个对象的hashcode、gc标记、gc次数、锁标记等存放于何处?
上诉皆存放于对象头的对象标记中
该图回答上诉new一个空对象占用多少内存,即16个字节。
下图展示一个对象的内存布局:
实例数据
存放类的属性(Field)数据信息,包括父类的属性信息
对齐填充
虚拟机要求对象起始地址必须是8字节的整数倍。填充数据不是必须存在的,仅仅是为了字节对齐这部分内存按8字节补充对齐。
Mark Word中记录的信息
拓展:为什么gc的最大分代年龄是15?因为对象头中仅有4bit用来记录分代年龄,则代表最大二进制为1111,转为十进制则为15
评论区