对于一个Java对象来说,对象头是极其重要的,对象头主要有对象标记和类型指针两部分组成,接下来需要重点看下对象标记,也就是Mark Word,下面是针对64位JVM(那也就是说还有32位的,考虑到现在基本都是64的了,32的直接pass掉)的Mark Word来说的,它的组成是这样的:

一个Java对象由对象头,实例数据和对齐填充组成,其中对象头是极其重要的,对象头是由对象标记Mark Word和类型指针组成,其中又以Mark Word最重要,对于Mark Word它占8个字节也就是64位!
ok,以上内容都清楚吧!那咱就继续! ?
接下来咱就以锁这个切入点去详细的看看这个Mark Word! ?
我们都知道在并发情况下也就是要解决线程安全的话要加锁,其实这个加锁就是对对象加锁,那如何去判断或者说知道这个对象加锁了没有或者加的什么锁,这些个信息其实就保存在对象头中的Mark Word中,上面这张图就是关于一个Mark Word的具体结构,可以看出,一个Java对象其实在不同的状态下,它是不一样的,主要是有不同的锁,比如没有锁,轻量级锁,还有什么偏向锁,重量级锁等等,不同的锁,在Mark Word中就会有不同的状态标记。
JOL的引入
这就是一个空类,啥也没有,要怎么看这个对象标记Mark Word呢?这里我们需要加入一个依赖,也就是你的Java项目是个maven项目,可以引入pom依赖,然后添加以下依赖:
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version>0.10</version>
</dependency>
这个依赖是干嘛的呢?这是一个代码工具叫做JOL,也就是Java Object Layout,主要就是用来分析java虚拟机中的对象布局的,也就是在java对象在虚拟机中的大小和分布,ok,接下来加入上述这个依赖之后我们就可以这样操作
public static void main(String[] args) {
System.out.println(VM.current().details());
}
这样我们就可以看出使用虚拟机的一些情况,看打印输出:  接着我们就来看下我们创建的那个空类是怎样的一个情况,可以这样操作:
public static void main(String[] args) {
MyClass myClass = new MyClass();
System.out.println(ClassLayout.parseInstance(myClass).toPrintable());
}
得出以下内容:  OK了,相关信息打印出来了,记住这是myclass的相关内部信息,那这些都是啥呢?看上面的图,是不是有个“Object header” 就是对象头 ?  这是啥?主要就是来看我们的一个空对象占多大空间,之前也说了,对象头包括对象标记8字节和类型指针8字节,我们先来看对象标记,是不是这个:
 也就是起始位置是0,然后前进4个字节,此时的起始位置就变成了4,接着再前进4个字节,那此时起始位置就成了8,此时对象标记就占8个字节,这没啥问题,接着我们看,起始位置是8,然后继续前进4字节,到达12的时候,其实此时类型指针就结束了,也就是8到12,类型指针就占了4字节
也就是此时这个对象就占据12个字节,可是不是说占据16个字节才对吗?我们知道java对象所占大小需要是8字节的整数倍,那为了满足这块,就又对齐填充了4字节,最终达到16字节 。
为什么会这样?其实是因为这里发生了指针压缩,在说这个指针压缩之前,需要明白这样的一东西:

public class MyClass {
char c='a';
public static void main(String[] args) {
MyClass myClass = new MyClass();
System.out.println(ClassLayout.parseInstance(myClass).toPrintable());
}
}
在空类中加入一个char类型,再看下结果:  接着我们再看一个:
public class MyClass {
char c='a';
int s=100;
}

为什么是6,一定要想明白了,记住8的倍数哦!对了,Instance size指的是一个对象有多大
指针压缩
接着我们再说之前指针压缩的问题,也就是类型指针是占8个字节的,可是实际上只占了4个字节,这就是指针压缩的问题,这里我们需要这么一个jvm参数,就是它:
java -XX:+PrintCommandLineFlags -version
也就是默认开启了指针压缩,所以我们的类型指针才变成了4字节。
value值分析

|