【Java 对象头】

Java对象的组成

java对象 == java 对象头 + 对象体 + 对齐字节(保证是8 byte 的整数倍)
堆中的java对象结构
对象的几个部分的作用:

  • Mark Word:主要用来表示对象的线程锁状态,另外还可以用来配合GC、存放该对象的hashCode。
  • Klass Word:是一个指向方法区中Class信息的指针,意味着该对象可随时知道自己是哪个Class的实例。
  • 数组长度:占用64位(8字节)的空间,这是可选的,只有当本对象是一个数组对象时才会有这个部分。
  • 对象体:用于保存对象属性和值的主体部分,占用内存空间取决于对象的属性数量和类型。
  • 对齐字节:补齐字节,保证是8 byte 的整数倍,为了减少堆内存的碎片空间。

Mark Word 标记字

在64位机器上,Java对象处于5种不同状态时Mark Word的表现形式,以下每一行代表对象处于某种状态时的样子。
Mark Word 标记字的组成
其中各部分的含义如下:

  • biased_lock(1位):偏向锁标识位。由于无锁和偏向锁的锁标识都是 01,没办法区分,引入一位的偏向锁标识位。
  • lock(2位):锁状态标识位。区分锁状态,比如11时表示对象待GC回收状态, 只有最后2位锁标识(11)有效。
  • age(4位):保存对象的分代年龄。表示对象被GC的次数,当该次数到达阈值的时,对象就会转移到老年代。在GC中,如果对象在Survivor区复制一次,年龄增加1。当对象达到设定的阈值时,将会晋升到老年代。默认情况下,并行GC的年龄阈值为15,并发GC的年龄阈值为6。由于age只有4位,所以最大值为15,这就是-XX:MaxTenuringThreshold选项最大值为15的原因。
  • identity_hashcode:保存对象的哈希码。运行期间调用System.identityHashCode()来计算,延迟计算,并把结果赋值到这里。当对象加锁后(偏向、轻量级、重量级),MarkWord的字节没有足够的空间保存hashCode,因此该值会移动到管程Monitor中。
  • thread:保存持有偏向锁的线程ID。偏向模式的时候,当某个线程持有对象的
    时候,对象这里就会被置为该线程的ID。 在后面的操作中,就无需再进行尝试获取锁的动作。这个线程ID并不是JVM分配的线程ID号,和Java Thread中的ID是两个概念。
  • epoch:保存偏向时间戳。偏向锁在CAS锁操作过程中,偏向性标识,表示对象更偏向哪个锁。
  • ptr_to_lock_record:轻量级锁状态下,指向栈中锁记录的指针。当锁获取是无竞争时,JVM使用原子操作而不是OS互斥,这种技术称为轻量级锁定。在轻量级锁定的情况下,JVM通过CAS操作在对象的Mark Word中设置指向锁记录的指针
  • ptr_to_heavyweight_monitor:重量级锁状态下,指向对象监视器Monitor的指针。如果两个不同的线程同时在同一个对象上竞争,则必须将轻量级锁定升级到Monitor以管理等待的线程。在重量级锁定的情况下,JVM在对象的ptr_to_heavyweight_monitor设置指向Monitor的指针。

    在这里插入图片描述

更直观的理解:

锁状态存储内容偏向锁标识位锁标识位
无锁哈希码、GC分代年龄001
偏向锁线程ID、时间戳、GC分代年龄101
轻量级锁指向栈中锁记录的指针ptr00
重量级锁指向Monitor的指针ptr10
GC标记11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值