![](https://img.haomeiwen.com/i2179862/606fc6c72a52b3bc.png)
对象头
-
MarkWord
用于存储对象自身的运行时数据
数据长度在32位和64位的虚拟机中分别为32bit和64bit,官方称它为“Mark Word”。对象需要存储的运行时数据很多,其实已经超出了32位、64位Bitmap结构能够记录的限度。但是对象头信息是与对象自身定义的数据无关的额外存储成本,考虑到虚拟机的空间效率,Mark Word被设计成为一个固定的数据结构以便在极小的空间存储尽量多的信息,它会根据对象的状态复用自己的存储空间。
-
对象头中的类型指针
对象指向它的类元数据的指针
虚拟机通过这个指针来确定这个对象是哪个类的实例,并不是所有的虚拟机实现都必须在对象数据上保留类型指针(还有通过句柄的方式)。另外,如果对象是一个Java数组,拿在对象头中还必须有一块用于记录数组长度的数据,因为虚拟机可以通过普通Java对象的元数据信息确定对象的大小,但是从数组的元数据中却无法确定数组的大小。
句柄:可以理解为一串数字,是一个对象的唯一标识,和对象一一对应
实例数据
对象真正存储的有限信息,也是程序代码中所定义的各种类型字段内容。
无论是从父类继承下来的,还是在子类中定义的,都需要记录起来。这部分的存储顺序会受到虚拟机分配参数(<code>FieldAllocationStyle</code>)和字段在Java源码中定义顺序的影响。
HotSpot虚拟机默认分配策略
- longs/doubles
- ints
- shorts/chars
- bytes/booleans
- oop(Ordinary Object Pointers)
从分配策略中可以看出,相同宽度的字段总是被分配到一起。在满足这个前提的条件下,在父类中定义变量会出现在子类之前。如果<code>CompactFields</code>参数值为true,那么子类之中较窄的变量也可能会插入到父类变量的空隙之中。
对齐填充(不必须)
对齐填充仅仅起着占位符的作用。
由于<code>HotSpot VM</code>的自动内存管理系统要求对象起始地址必须是8字节的整数倍,换句话说,就是对象的大小必须是8字节的整数倍。而对象头部分正好是8字节的倍数,因此,当对象实例数据部分没有对齐时,就需要通过对齐填充来补全。
补充:
HotSpot这个具体的拼写方式通常指的是一个JVM实现的名字——HotSpot VM。
这个JVM最初由<code>Longview/Animorphic</code>实现,随着公司被Sun/JavaSoft收购而成为Sun的JVM,并于JDK 1.3.0开始成为Sun的Java SE的主要JVM。在Sun被Oracle收购后,现在HotSpot VM是Oracle的Java SE的主要JVM。
HotSpot VM得名于它得混合模式执行引擎:这个执行引擎包括解释器和自适应编译器(adaptive compiler)。
详情:RednaxelaFX
历史遗留文章……
网友评论