
JVM中对象存储的内存布局有三大部分,分别是对象头,实例数据,对齐填充;
1.对象头
对象头分为三部分,第一部分我们知道有这么个东西就行,第二部分其实就是代表这个对象的来源,比如这个对象是user,那么他的类型就指向User这个类,第三部分就好理解了,就说他如果是一个数组,这里记录了他的长度。
2.实例数据
实例数据部分是对象真正存储的有效信息,也既是我们在程序代码里面所定义的各种类型的字段内容,无论是从父类继承下来的,还是在子类中定义的都需要记录下来。
注意:对象头加上实例数据的大小必须是8字节的整数倍,如果不够,对其填充来补充,这样就方便JVM来进行内存的分配以及垃圾回收;例如两者加起来30字节,那么对齐填充就会再占据2字节凑够8的整数倍
3.对象的访问定位

昨天是虚拟机规范,要访问对象可以通过两种方式:
第一种是使用句柄,句柄池中存放的是到对象实例数据或者类型数据的指针,相当于一个中间人,如果实例数据修改的话,只需要修改句柄池中的指针指向即可,而不需要对java栈中的引用做任何的修改,这样的方式增加了稳定性,但是性能有所下降
第二种是使用直接指针,相较于第一种方式,直接指针就是引用对象直接可以指向java堆中的对象,可以直接访问,然后java堆中的对象还有指向方法区的对象类型数据的指针。这样的话虽然性能效率高了,但是稳定性有所下降,因为堆中的对象有所修改的话,那么java栈中的引用就要调整指针指向了。
网友评论