深入理解Java虚拟机之对象的内存布局、访问定位

栏目: Java · 发布时间: 6年前

内容简介:在HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据(Instance Data)、对齐填充(Padding)。对象头分为两个部分,第一部分存储自身的

内存布局

在HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据(Instance Data)、对齐填充(Padding)。

对象头

对象头分为两个部分,第一部分存储自身的 运行时数据 ,如对象的哈希码、GC分代年龄、锁标志位等。这部分数据的长度在32位和64位的虚拟机中分别为32bit和64bit,官方称它为“Mark World”,Mark Word被设计为一个非固定的数据结构,以便在极小的内存空间内存储尽量多的信息,它会根据对象的状态复用自己的存储空间。32位HotSpot虚拟机对象头Mark Word存储内容如下:

深入理解 <a href='https://www.codercto.com/topics/22013.html'>Java</a> 虚拟机之对象的内存布局、访问定位

第二部分是 类型指针 ,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。

如果对象是一个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中存储的就是对象的句柄地址,句柄中包含了对象实例数据与类型数据各自的地址信息。

    深入理解Java虚拟机之对象的内存布局、访问定位

  • 直接指针访问 :reference中存储内容为对象地址。

    深入理解Java虚拟机之对象的内存布局、访问定位

两种访问方式优势对比

句柄访问最大的好处是reference中存储的是稳定的句柄地址,在对象被移动时只会改变句柄中的实例数据的指针,而无需修改reference本身。

直接指针访问的最大好处是速冻更快,节省了一次指针定位的时间开销。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

微信民族志、自媒体时代的知识生产与文化实践

微信民族志、自媒体时代的知识生产与文化实践

赵旭东 / 中国社会科学出版社 / 2017-9 / 98.00元

进入二十一世纪以来,随着网络技术的发展,自媒体的悄然登场深度影响着我们的日常生活。中国社会中自媒体通讯方式的普及以及随之而有的一种文化书写的新形式——微信民族志的出现使原有文化秩序中时空意义发生转变的同时,也在重新塑造着以研究异文化为己任的人类学学科自身的成长、转型与发展。在此种情境之下,由中国人民大学人类学研究所、中国人民大学国家发展与战略研究院、中国人民大学社会学理论与方法研究中心、《探索与争......一起来看看 《微信民族志、自媒体时代的知识生产与文化实践》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

随机密码生成器
随机密码生成器

多种字符组合密码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码