java对象的内存布局分为三部分,对象头、实例数据、对齐补白
对象头:
1.mark word,包含了对象的hash值,GC分代年龄,锁状态,线程持有的锁,偏向锁等信息
2.指向当前对象所属类的Class对象指针,通过它可以获取class信息,这个指针是反射的基础。32位操作系统和64位操作系统的一个主要区别是内存地址空间范围不一样,最大值分别为2的32次方、2的64次方,相应的,如果想表示内存地址,分别需要32位和64位,在开发语言中,一个引用其实就是一个地址,在java中,我们通过对象引用来访问对象,对象引用就是一个地址;比如:Object obj=new Object(); 这里obj就是一个地址,在32位操作系统中,obj这个引用占32位,也就是4byte,64位操作系统中是8byte,不过64位操作系统下的jvm会默认开启指针压缩功能,将8byte压缩为4byte。
3.如果是数组,还必须包括数据的长度信息,这是可选的,只有当本对象是一个数组对象时才会有这个部分.
对象头的长度:这里只说64位操作系统
开启了UseCompressedOops指针压缩的(默认开启):
普通对象头:12byte
数组对象头:16byte
关闭了UseCompressedOops的:
普通对象头:16byte
数组对象头:24byte
实例数据:
接下来就是实例数据,也就是对象成员变量的内容,包括了从父类继承下来的内容
对齐补白:
jvm要求java对象的起始地址必须是8的倍数,如果对象头+实例长度不足8的倍数,就需要补齐
Mark Word
以上是 Java对象处于5种不同状态时,Mark Word中 64位的表现形式,上面每一行代表对象处于某种状态时的样子。其中各部分的含义如下:
【1】lock:2位的锁状态标记位,由于希望用尽可能少的二进制位表示尽可能多的信息,所以设置了 lock标记。该标记的值不同,整个 Mark Word表示的含义不同。biased_lock 和 lock一起,表达的锁状态含义如上图所示。
【2】biased_lock:对象是否启用偏向锁标记,只占1个二进制位。为1时表示对象启用偏向锁,为0时表示对象没有偏向锁。lock 和 biased_lock共同表示对象处于什么锁状态
【3】age:4位的 Java对象年龄。在GC中,如果对象在 Survivor区复制一次,年龄增加1。当对象达到设定的阈值时,将会晋升到老年代。默认情况下,并行 GC的年龄阈值为15,并发GC的年龄阈值为6。由于age只有4位,所以最大值为15,这就是-XX:MaxTenuringThreshold 选项最大值为15的原因。因此对象经过了15次垃圾回收后如果还存在,则肯定会移动到老年代中。
【4】identity_hashcode:31位的对象标识hashCode,采用延迟加载技术。调用方法 System.identityHashCode()计算,并会将结果写到该对象头中。当对象加锁后(偏向、轻量级、重量级),MarkWord的字节没有足够的空间保存hashCode,因此该值会移动到线程 Monitor中。
【5】thread:持有偏向锁的线程ID。
【6】epoch:偏向锁的时间戳。
【7】ptr_to_lock_record:轻量级锁状态下,指向栈中锁记录的指针。
【8】ptr_to_heavyweight_monitor:重量级锁状态下,指向对象监视器 Monitor的指针。
我们通常说的通过 synchronized实现的同步锁,真实名称叫做重量级锁。但是重量级锁会造成线程排队(串行执行),且会使 CPU在用户态和核心态之间频繁切换,所以代价高、效率低。为了提高效率,不会一开始就使用重量级锁,JVM在内部会根据需要,按如下步骤进行锁的升级:
【1】初期锁对象刚创建时,还没有任何线程来竞争,对象的 Mark Word是下图的第一种情形,这偏向锁标识位是0,锁状态01,说明该对象处于无锁状态(无线程竞争它)。
【2】当有一个线程来竞争锁时,先用偏向锁,表示锁对象偏爱这个线程,这个线程要执行这个锁关联的任何代码,不需要再做任何检查和切换,这种竞争不激烈的情况下,效率非常高。这时 Mark Word会记录自己偏爱的线程的ID,把该线程当做自己的熟人。如下图第二种情形。
【3】当有两个线程开始竞争这个锁对象,情况发生变化了,不再是偏向(独占)锁了,锁会升级为轻量级锁,两个线程公平竞争,哪个线程先占有锁对象并执行代码,锁对象的 Mark Word就执行哪个线程的栈帧中的锁记录。如下图第三种情形。
【4】如果竞争的这个锁对象的线程超过两个线程,导致了更多的切换和等待,JVM会把该锁对象的锁升级为重量级锁,这个就叫做同步锁,这个锁对象 Mark Word再次发生变化,会指向一个监视器对象,这个监视器对象用集合的形式,来登记和管理排队的线程。如下图第四种情形。
注意:本文归作者所有,未经作者允许,不得转载