java对象头


在hotspot虚拟机中,对象在内存的分布分为3个部分,对象头,实例数据,和对齐填充。本文主要讲解对象头。


hotspot虚拟机的对象头主要分为2个部分。


第一部分


 主要存储对象自身的运行数据比如:哈希码、GC分代年龄、锁状态标志、线程持久的锁、偏向线程的ID、偏向时间戳等。

这部分数据的长度在32位和64为虚拟机上分别对象32bit和64bit。官方称之为“mark word” 。mark word 被设计为非固定的数据结构,以便在及小的空间内

存储更多的信息。比如:在32位的hotspot虚拟机中:如果对象处于未被锁定的情况下。mark  word 的32bit空间中有25bit存储对象的哈希码、4bit存储对象的

分代年龄、2bit存储锁的标记位、1bit固定为0。

而在其他的状态下(轻量级锁、重量级锁、GC标记、可偏向)下对象的存储结构为

java对象头_第1张图片


第二部分

对象头的另外一部分是对象类型,即对象指向它类元数据的指针。虚拟机通过这个指针来确定对象时那个磊的实例(并不是所有的虚拟机都在对象头中包含了对象的类型指针)。如果对象时一个数组。那么在对象头中还会有一块用于记录数组长度的数据。因为虚拟机可以通过普通java对象的元数据确定java对象的大小。但是从数组的元数据中无法确认数组的大小。








你可能感兴趣的:(虚拟机)