JVM 对象的组成

最近和同事交谈,我问他们要不要写博客,得到的答案大多都是不喜欢写博客的这种方式,其实也的确是这样,每个人心中都有一杆秤,这杆秤不仅仅称公理人心,也称收益付出,写博客是一件很耗费时间的事,要查比较多的资料,也要了解足够的知识。这其中的付出很难在短时间得到回报。而且每个人眼中的世界不一样,也许你辛辛苦苦写的博客,也就是复制粘贴的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来记录次数,从而判断对象有没有被线程竞争到。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容