Java对象保存在内存中的结构如下:
- 对象头
- 对象体
- 对齐部分
对象头
对象头一般由两部分组成:Mark Word 和 Class Metadata Address。如果是数组类型,则对象头中会多一项:Array Length,也就是存储数组的长度。
Mark Word
主要用来表示对象的线程锁状态,另外还可以用来配合GC、存放该对象的hashCode、GC分代年龄、锁状态标志、线程持有帧、线程持有的锁、线程偏向ID、偏向时间戳等。这部分长度为一字宽
Class Metadata Address
对象指向它的类元数据的指针。长度也是一字宽
对象体
这里保存的就是对象真正存储的有效信息,也是程序代码中所定义的各种类型的字段内容。无论是从父类继承下 来的,还是在子类中定义的,都需要记录起来。
对齐部分
主要作用是用来提供占位符作用的,保证整个对象是8字节的倍数。因为HotSpot VM的自动内存管理系统要求对象起始地址必须是8字节的整数倍,换句话说,就是对象的大小必须是8字节的整数倍。
字宽:在32位JVM中的长度是32bit,在64位JVM中长度是64bit。