JAVA对象头

#为了防止自己忘记,先记着,之前我一直以为《深入理解JAVA虚拟机》写错了来着。

一. JAVA对象

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

也就是说  JAVA对象 = 对象头 + 实例数据 + 对象填充

 二. 对象头

对象头由两部分组成,一部分用于存储自身的运行时数据,称之为 Mark Word,另外一部分是类型指针,及对象指向它的类元数据的指针。

对象头 = Mark Word + 类型指针

(未开启指针压缩的情况下)

在32位系统中,Mark Word = 4 bytes = 32 bits,对象头 = 8 bytes = 64 bits;

在64位系统中,Mark Word = 8 bytes = 64 bits ,对象头 = 16 bytes = 128bits;

三. 实例数据

http://www.cnblogs.com/magialmoon/p/3757767.html  引用这位大手子的文章

原生类型(primitive type)的内存占用如下:

Primitive Type Memory Required(bytes)
boolean                       1
byte                             1
short                            2
char                             2
int                                4
float                             4
long                             8
double     8

reference类型在32位系统上每个占用4bytes, 在64位系统上每个占用8bytes。

四. 对齐填充

对齐填充并不是必然存在的,也没有什么特别的意义,他仅仅起着占位符的作用,由于HotSpot VM的自动内存管理系统要求对象起始地址必须是8字节的整数倍,换句话说,就是对象的大小必须是8字节的整数倍。而对象头正好是8字节的倍数,因此,当对象实例数据部分没有对齐时,就需要通过对齐填充来补全。

posted @ 2017-09-04 21:34  zY-  阅读(2409)  评论(0编辑  收藏  举报