1. 对象的内存布局
![](https://img.haomeiwen.com/i5340978/0cb6806f9f063e0e.png)
1.1 对象头
对象头包含两类数据,第一类是用于存储对象自身的运行时数据;第二类是类型指针,用于指向它的类型元数据,用来确定该对象实例所指向的类。
1.2 实例数据
真正存储的有效信息。
1.3 对齐填充
没有特殊意义,也不是必然存在的,起占位符的作用。HotSpot虚拟机的内存管理系统要求对象的起始地址必须是8字节的整数倍,即任何对象的大小必须是8字节的整数倍,对没对齐的部分,通过对齐方式进行补全。
2. 对象的访问定位
通过栈上的reference数据来操作堆上的具体对象。对象的访问方式主要为两种,分为使用句柄和直接指针。
-
使用句柄访问,JAVA堆划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含实例数据和类型数据各自的地址信息。
-
使用直接指针访问,reference中存储的是对象地址,要访问类型数据需要通过 实例找到类型数据的引用地址。
HotSot主要使用第二种即直接指针访问的方式进行对象操作。
网友评论