JVM(PART III)对象的内存布局

来源:互联网 发布:沈航网络自助平台套餐 编辑:程序博客网 时间:2024/06/01 07:46

在HotSpot虚拟机中,对象在内存中的布局可以分为3块区域:对象头(Header),实例数据(Instance Data)和对齐填充(Padding)。——《深入理解java虚拟机》

布局:

这里写图片描述

对象头:

共包括两个部分:
Tips:如果对象是一个Java数组,那么在对象头中还必须有一块用于记录数组长度的数据。(JVM可以通过普通java对象的元数据信息确定java对象的大小,但是从数组的元数据中无法得知数组的大小)。
这里写图片描述

运行时数据(Mark Word)

这个部分主要包括:哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳。
在32位和64位的虚拟机中长度分别为32bit和64bit

在32位的HotSpot虚拟机中,如果对像除以未被锁定的状态下:
这里写图片描述

类型指针

AKA:对象指向它的类元数据的指针,虚拟机通过这个指针来判断这个对象是哪个类的实例。(并不是所有虚拟机都需要保留)。

实例数据

记录从父类继承和自己定义的字段的内容。
在Hotspot中的分配策略:
longs/doubles
ints
shorts/chars
bytes/booleans
oops(Ordinary Object Pointers)
相同字宽的会被分配到一起。在父类中定义的变量出现在子类之前。

对齐填充

存在的意义:占位符
HotSpot VM的自动内存管理系统要求对象的起始地址必须为8字节的整数倍。(对象的大小必须为8字节的整数倍,对象头部分正好是8字节的倍数)。当实例数据没有对齐时需要通过对齐填充来补全。

原创粉丝点击