JVM对象的内存布局与对象的访问定位(六)

内存布局

对象在堆中可以划分为三个部分:对象头,实例数据,对齐填充

1. 对象头

HotSpot虚拟机对象头包含两类信息,一类用于存储对象自身的运行时数据,如哈希码,GC分代年龄,锁状态标志,线程持有的锁等。这部分的长度在32位和64位虚拟机中分别占32比特和64比特,官方称为**“Mark Word”**。
在32个比特空间中25个比特用来存储哈希码,4个比特用于存储对象分代年龄,2个比特用于存储锁标志位,1个比特固定为0。
另一部分:类型指针,指向它类型元数据的指针,通过指针来判断该对象是哪个类的实例。

2.实例部分

存储对象的有用信息,如代码中所定义的各种类型的字段内容,无论是父类继承还是子类定义的字段。

3.对齐填充

这一部分内容不一定存在,没有特别含义,占位符,必须为8字节的整数倍。

访问定位

Java程序会通过栈上的reference数据来操作堆上的具体内容。reference类型为一个指向对象的引用。对象的主流访问方式有两种

1.句柄

Java堆会划分出一块内存来用做句柄池,reference中存储的就是对象句柄地址,句柄中包含了对象实例数据与类型数据各自具体的地址信息。

2.直接指针

reference中存储的直接就是对象地址

使用句柄访问的优点:对象被移动时只会改变句柄的实例数据之争,而reference本身不用修改。
使用直接指针访问的优点:速度更快,节省时间开销,HotSpot虚拟机主要使用此方法。

猜你喜欢

转载自blog.csdn.net/weixin_43663421/article/details/109270081