【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) (37834320mark-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来记录次数,从而判断对象有没有被线程竞争到。