【Java架构师】JVM 对象的组成

234 篇文章 6 订阅
77 篇文章 1 订阅

【Java架构师】最近和同事交谈,我问他们要不要写博客,得到的答案大多都是不喜欢写博客的这种方式,其实也的确是这样,每个人心中都有一杆秤,这杆秤不仅仅称公理人心,也称收益付出,写博客是一件很耗费时间的事,要查比较多的资料,也要了解足够的知识。这其中的付出很难在短时间得到回报。而且每个人眼中的世界不一样,也许你辛辛苦苦写的博客,也就是复制粘贴的cv处理而已,还是那句话,打井是靠一锤子一锤子打出来了,路是靠一步一步走出来的,做自己喜欢的事并且坚持下去,结果一定是美丽的。

这次讲讲对象的组成

学习就是对一件事情知其然知其所以然,想融汇贯通,就要窥其全貌,java万物街对象,那对象里面是啥呢

对象是由,对象头,实例数据,及其填充组成的

运行下这段代码

System.out.println(VM.current().details());
Object obj = new Object();
//获取int类型二进制的字符串表示
System.out.println(Integer.toBinaryString(obj.hashCode()));
//获取int类型16进制的字符串表示
System.out.println(obj + " 十六进制哈希:" + Integer.toHexString(obj.hashCode()));
System.out.println(ClassLayout.parseInstance(obj).toPrintable());
输出

OFFSET SIZE TYPE DESCRIPTION VALUE

  0     4        (object header)                           01 c2 7b aa (00000001 11000010 01111011 10101010) (-1434729983)

  4     4        (object header)                           36 00 00 00 (00110110 00000000 00000000 00000000) (54)

  8     4        (object header)                           28 0f 8d 16 (00101000 00001111 10001101 00010110) (37834320

mark-word 中包含 Monitor 对象
8)

 12     4        (loss due to the next object alignment)

Instance size: 16 bytes

Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

这里面就是对象的组成,因为对象没有存储数据所以能看到 一共16个字节 对象头占了12填充占了4个,那为啥没有实例数据呢,因为这个对象并没有放数据

那对象头里面都有啥呢

mark-word 对象标记对象 这里面存储对象的hash码 已经轻量级锁的标记 和偏向锁的标记

Kclass Point class的类型指针 也就是存储对象的内存地址

其中 mark-word 里面有 Monitor对象

这对象比较关键,线程竞争同步锁的时候,其实就是竞争这个对象,竞争到了就锁定

ObjectMonitor() {
_header = NULL;
_count = 0; // 记录个数
_waiters = 0,
_recursions = 0; // 线程重入次数
_object = NULL; // 存储 Monitor 对象
_owner = NULL; // 持有当前线程的 owner
_WaitSet = NULL; // 处于wait状态的线程,会被加入到 _WaitSet
_WaitSetLock = 0 ;
_Responsible = NULL ;
_succ = NULL ;
_cxq = NULL ; // 单向列表
FreeNext = NULL ;
_EntryList = NULL ; // 处于等待锁block状态的线程,会被加入到该列表
_SpinFreq = 0 ;
_SpinClock = 0 ;
OwnerIsThread = 0 ;
_previous_owner_tid = 0;}
里面有count来记录次数,从而判断对象有没有被线程竞争到。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值