Java对象结构详解

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

数组长度信息

非必须

 

 

你可能感兴趣的:(Java知识点总结,Java对象结构详解,Mark,word,Object,Harder,对象头,synchronized原理)