一起探究-java对象头
一起探究-java对象头
前言
大家好,我是清风,前几天在晚上听网课,有一个小伙伴在评论区问一个空Object对象多大?我不自觉的就打上了16byte,然后没想到有小伙伴在评论区质疑我,还让我多看点书,给我弄的苦笑不得,我寻思那你说多大把?他告诉我4byte,然后说我这基本功不行,然后我就不回他了,感觉没有意义,所以这篇文章我打算和大家一起探讨一下java的对象头,顺便宣泄一下自己委屈的心灵
误区
可能很多小伙伴都听过对象头,然后在论坛上一搜一大把,大多数的文章直接就附上了一个图
我是极力反对这么学的,甚至你要是看这张图,你对象头永远也学不会,大家看好了这个图的来源,这张图是周志明《深入理解java虚拟机》上的一个图,但是大家注意,这本书是32位计算机的,但是注意大清已经亡了,现在几乎没有人用32位电脑所以我们今天要一起看一看java对象头,到底是个什么东东
对象的内存布局
如果你之前对这个没有一点了解,你可能会问,对象有什么内存布局,那我写啥内容不就是啥么?对没错,你看见的是对象的内容,但是那只是对象的一部分,还有一些内存我们是看不见的,最起码我们不借助一些工具是看不见的,
对象在内存中的存储布局可分为三个区域:对象头,实例数据,对齐填充
那么书里确实是这么说的,但是真实是这样么,我们需要眼见为实
证明
首先我们需要用maven导入jar
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version>0.9</version>
</dependency>`
这个工具可以让我们分析对象在JVM的大小和分布
import org.openjdk.jol.info.ClassLayout;
public class Main2 {
public static void main(String[] args) {
User user = new User();
System.out.println(ClassLayout.parseInstance(user).toPrintable());
}
}
打印如下:
好现在我们就可以看见有对象的内存布局,他是真实存在的
分析
从图上我们可以看出对象头是 12byte ,没有实例数据,4byte的对齐填充,(要满足8的整数倍),现在我就想知道那个同学的一个对象4byte的结论是从哪来的,不说了,接下来我们一起分析那些010101表示的是什么把
现在我们发现打印出了好多0,但是当我们对象执行hashcode方法之后大家观察一下
本来是0的地方被写上了数字,这是因为我们在没有调用hashcode方法之前,这个地址是没有被计算的,对象头的内容还有很多,大家可以写一些代码观察一下,比如锁的升级过程看看是不是跟书上所说的一样,对象头又是由哪些部分组成,本文就不继续拓展了,本文只是希望大家学习的过程中质疑所学,要不然学完就忘了,不入脑子,那再见了
推荐阅读