内容简介:在HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据(Instance Data)、对齐填充(Padding)。对象头分为两个部分,第一部分存储自身的
内存布局
在HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据(Instance Data)、对齐填充(Padding)。
对象头
对象头分为两个部分,第一部分存储自身的 运行时数据 ,如对象的哈希码、GC分代年龄、锁标志位等。这部分数据的长度在32位和64位的虚拟机中分别为32bit和64bit,官方称它为“Mark World”,Mark Word被设计为一个非固定的数据结构,以便在极小的内存空间内存储尽量多的信息,它会根据对象的状态复用自己的存储空间。32位HotSpot虚拟机对象头Mark Word存储内容如下:
第二部分是 类型指针 ,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。
如果对象是一个Java数组,对象头中还必须有一块用于记录数组长度的数据,因为虚拟机可以通过普通Java对象的元数据信息确定Java对象的大小,但从数组的元数据却无法确定数组的大小。
实例数据
实例数据部分是对象真正存储的有效信息,也是程序代码中所定义的各种类型的字段内容。无论是从父类继承下来的,还是在子类中定义的,都需要记录下来。这部分的存储顺序会受到虚拟机分配策略参数(FieldsAllocationStyle)和Java字段在Java源码中定义的顺序的影响。HotSpot虚拟机默认的分配策略为longs/doubles、ints、shorts/chars、bytes/boolean、oops(ordinary object pointers),相同宽度的字段总是被分配到一起。
对齐填充
对齐填充并不是必然存在的,仅起着占位符的作用。由于HotSpot VM的自动内存管理系统要求对象的起始地址必须是8字节的整倍数,而对象头刚好是8字节的整倍数,所以当对象实例数据部分没有对齐时,就需要通过对齐填充来补全。
访问定位
建立对象是为了使用对象,我们的Java程序需要通过栈上的reference数据来操作堆上的具体对象。
访问方式
-
句柄访问 :在堆中划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,句柄中包含了对象实例数据与类型数据各自的地址信息。
-
直接指针访问 :reference中存储内容为对象地址。
两种访问方式优势对比
句柄访问最大的好处是reference中存储的是稳定的句柄地址,在对象被移动时只会改变句柄中的实例数据的指针,而无需修改reference本身。
直接指针访问的最大好处是速冻更快,节省了一次指针定位的时间开销。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 深入探索Android布局优化(上)
- 深入进阶:图解分析JVM内存堆布局
- [译] 从原型图到成品:步步深入 CSS 布局
- css经典布局系列三——三列布局(圣杯布局、双飞翼布局)
- 四种方法实现──三栏布局(圣杯布局、双飞翼布局)
- 浅谈CSS三栏布局(包括双飞翼布局和圣杯布局)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
深入浅出WebAssembly
于航 / 电子工业出版社 / 2018-11 / 128.00元
WebAssembly是一种新的二进制格式,它可以方便地将C/C++等静态语言的代码快速地“运行”在浏览器中,这一特性为前端密集计算场景提供了无限可能。不仅如此,通过WebAssembly技术,我们还可以将基于Unity等游戏引擎开发的大型游戏快速地移植到Web端。WebAssembly技术现在已经被计划设计成W3C的标准,众多浏览器厂商已经提供了对其MVP版本标准的支持。在Google I/O ......一起来看看 《深入浅出WebAssembly》 这本书的介绍吧!