Java对象结构详解

本文详细解析了Java对象在JVM中的结构,包括对象头的Mark word和Klass word,以及数组长度(如果对象是数组的话)。重点讨论了Mark word在实现synchronized加锁机制中的作用和存储的运行时数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

synchronized (obj) { 
    ... 
}

大家都知道以上代码可以实现加锁。有没有想过synchronized到底是怎么实现加锁的?synchronized底层的逻辑是什么样的?

要弄清楚这个问题,就有必要了解一下在JVM虚拟机中一个Java对象是怎么存在的,换句话说就是在虚拟机中用什么结构来表示一个Java对象,或者一个Java对象的组成结构是什么样的。

划重点~~

根据JVM虚拟机规范 一个Java 对象由 Object Header (对象头),Instance Data(实例数据), Padding(对齐区域) 三部分组成。

区域名

描述说明

是否必须

对象头

JVM规范规定的每个Java对象都有的一块区域,用于实现一些额外的增强功能(如:锁,hashCode,GC)

必须

实例数据

当前对象属性数据信息,包括父类的属性信息

非必须

对齐数据

按照JVM规范规定每个对象的起始地址必须是8个字节的整数倍,所以当对象头加实例数据的大小不是8个字节的整数倍时,就需要用占位符填充对齐至下一个8字节的整数倍位,这些占位符填充对齐区域被称为对齐数据

非必须

对象头

Every object (except array) in memory has 2 machine word header. The first one is called mark word and the second one is klass word. Btw arrays have extra 32 bit word filled with array’s length.

Mark word stores identity hashcode, bits used for garbage collection, bits used for locking. To find out more check out the source from OpenJDK.

Klass word stores ordinary object pointer (oop) to class metadata, which describes the object’s layout, methods, and other type information. To find out more check out the metadata source from OpenJDK.

 

由官方文档描述可知,对象头一般由Mark word和Klass word 两部分组成,但如果对象是一个数组,则对象头中还包含记录数组长度的数据。

  • Mark word : 存储对象自身的运行时数据,如 HashCode、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳、GC分代年龄等;mark word的位长度为JVM的一个Word大小,也就是说32位JVM的Mark word为32位,64位JVM为64位;为了让一个字大小存储更多的信息,JVM将字的最低两个位设置为标记位;Java中 synchronized关键字的同步锁以及GC回收等都和Mark Word息息相关。
  • KLass Word: 保存指该对象的类元数据的指针,也就是通过这个指针信息可以知道这个对象是哪个类的实例。
  • Array length: 如果对象是一个数组,那么对象头还需要有额外的空间用于存储数组的长度。

区域名

描述说明

是否必须

Mark word

对象自身的运行时数据,如 HashCode、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳、GC分代年龄等

必须

KLass Word

对象的类元数据的指针

必须

Array length

数组长度信息

非必须

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值