在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)(保证8个字节的倍数)。

而对象头又分为以下三种
面试题
Object object=newObject()谈谈你对这句话的理解?
public class ObjectHeaderDemo {
public static void main(String[] args) {
Object o = new Object();
//哈希码存在对象的哪里
System.out.println(o.hashCode());
//GC标记和GC次数又放在哪里
System.gc();
}
}

一般而言JDK8按照默认情况下,new一个对象占多少内存空间?
在64位虚拟机下,MarkWord是64bit大小的,其存储结构如下所示



由图可见,MarkWord默认存储对象的HashCode、分代年龄和锁标志位等信息。
这些信息都是与对象自身定义无关的数据,所以MarkWord被设计成一个非固定的数据结构以便在极小的空间内存存储尽量多的数据。它会根据对象的状态复用自己的存储空间,也就是说在运行期间MarkWord里存储的数据会随着锁标志位的变化而变化。

所谓的类元信息(类型指针)其实就可以说是模板
在main方法中新建一个Customer的实例,这个实例会被新建在堆空间
而其对象头的类型指针指向的是方法区的模板,也就是Customer的klass的类元信息
实例数据是指属性数据信息,包括父类的属性信息

而对齐填充是指虚拟机要求对象起始地址必须是8字节的整数倍。填充数据不是必须存在的,仅仅是为了字节对齐这部分内存按8字节补充对齐。
比如说只有一个对象头的实例对象,16字节+4字节+1字节=21字节,因为21不是8的倍数,所以需要对其填充,填充3字节,使其是8的倍数