对象在内存中的结构
- 对象头
- markword(存储对象自身的运行时数据,如哈 希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等)
- 指向类型元数据的指针,如果是数组,还需要有长度信息(普通对象的大小编译时已经确定,数组类型必须记录长度)
- 实例数据
- 对齐填充(java虚拟机要求对象起始地址为8字节的整数倍,弥补实例数据部分的不足)
对象访问定位形式
-
句柄
在java堆中划分出一块内存来作为句柄池,reference中存储着对象的句柄地址,句柄中又分别记录着对象的实例和对象元数据的的地址信息
-
直接指针
reference中存储的直接就是对象地址,对象元数据信息由对象头记录指针,hotspot就使用这种方法访问对象
图片来源于深入理解java虚拟机
直接指针的访问速度快,句柄访问在对象移动的时候(标记复制/整理都会涉及到)无需改变reference,只需修改句柄引用即可,因此两者各有优势。