目录
一、对象的内存布局
在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)(保证8个字节的倍数)
对象头分为对象标记(MarkOop)与类元信息(KlassOop),类元信息存储的是指向该对象类元数据(Klass)的首地址。
1.1、对象头
1.1.1、对象标记
默认存储对象的HashCode、分代年龄和锁标志位等信息。这些信息都是与自身定义无关的数据,所以MarkWord被设计成一个非固定的数据结构以便在极小的空间内存存储尽量多的数据。它会根据对象的状态复用自己的存储空间,也就是说在运行期间MarkWord里存储的数据会随着锁标志位的变化而变化。
1.1.2、类元信息
对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是那个类的实例。
1.2、实例数据
存放类的属性(Field)数据信息,包括父类的属性信息
1.3、对齐填充
虚拟机要求对象起始地址必须是8字节的整倍数。填充数据不是必须存在的,仅仅是为了字节对齐,这部分内容按8字节补充对齐。
二、使用JOL进行测试
<dependencies>
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version>0.9</version>
</dependency>
</dependencies>
public class JOLDemo {
public static void main(String[] args) {
//VM的细节详情
System.out.println(VM.current().details());
System.out.println("-----------");
//VM的所有对象的分配都是8的整数倍
System.out.println(VM.current().objectAlignment());
}
}
三、对象分代年龄
GC年龄采用4位bit存储最大为15
参数:-XX:MaxTenuringThreshold=16