对象的布局
在HotSpot中,对象的布局划为三个部分:对象头、实例数据、对其填充
对象头
对象头包含两类信息:
1、存储对象自身的运行时数据,如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。
2、类型指针,指向对象的类型元数据的指针,通过该指针能确定对象是哪个类的实例。但是,查找对象的元数据信息不一定要经过对象本身。
实例数据
该部分是对象真正存储的有效信息。
对齐填充
没有特殊的作用,仅仅起占位符的作用。HotSpot虚拟机要求对象大小的8字节的整数倍,当对象大小不符合条件时需要进行填充。
对象的访问定位
主流的对象访问方式有两种:
1、句柄访问:堆中划分一块内存作为句柄池,引用中存放的是对象的句柄地址,句柄中包含了对象的实例数据地址信息和类型数据地址信息(实例数据在堆中,对象类型数据在方法区中)。
2、直接指针访问:堆中存放了对象类型数据的指针和对象的实例数据。
两种方式的对比:
句柄方式的好处是引用中存储的是稳定的句柄地址,对象被移动时只改变句柄中的实例数据指针。
直接指针的好处是速度更快,节省了一次指针定位的开销。