一起探究-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方法之前,这个地址是没有被计算的,对象头的内容还有很多,大家可以写一些代码观察一下,比如锁的升级过程看看是不是跟书上所说的一样,对象头又是由哪些部分组成,本文就不继续拓展了,本文只是希望大家学习的过程中质疑所学,要不然学完就忘了,不入脑子,那再见了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值