zoukankan      html  css  js  c++  java
  • JAVA对象结构

    对象的内存布局

    在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header),实例数据(Instance Data)和对象填充(Padding)。

    • 实例数据:对象真正存储的有效信息,存放类的属性数据信息,包括父类的属性信息;
    • 对齐填充:由于虚拟机要求 对象起始地址必须是8字节的整数倍。填充数据不是必须存在的,仅仅是为了字节对齐。
    • 对象头:Hotspot虚拟机的对象头主要包括两部分数据:Mark Word(标记字段)、Class Pointer(类型指针)。

    对象头

    对象头主要包括两部分数据:Mark Word(标记字段)、Class Pointer(类型指针)。

    • Class Pointer:是对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例
    • Mark Word : 用于存储对象自身的运行时数据,它是实现轻量级锁和偏向锁的关键。

    Mark word

    Mark Word 用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳等。

    在32位的HotSpot虚拟机中,如果对象处于未被锁定的状态下,那么Mark Word的32bit空间里的25位用于存储对象哈希码,4bit用于存储对象分代年龄,2bit用于存储锁标志位,1bit固定为0,表示非偏向锁。其他状态如下图所示:

    • 前面分析可知,monitor特点是互斥进行,你再喵一下上图,重量级锁,指向互斥量的指针
    • 其实synchronized是重量级锁,也就是说Synchronized的对象锁,Mark Word锁标识位为10,其中指针指向的是Monitor对象的起始地址。
    • 顿时,是不是感觉柳暗花明又一村啦!对象与monitor怎么关联的?答案:Mark Word重量级锁,指针指向monitor地址

    总图如下:

    锁的膨胀过程如下:

  • 相关阅读:
    【MySQL】【2】数字排序问题
    【MySQL】【1】表中存在重复记录,删除保留其中一条
    poj 1811 Prim test
    Yours 的博客开张啦!
    P1044
    P1103
    hustwinter1-B
    hustwinterC
    hustwinter1-A
    hdu 2138 How many prime numbers
  • 原文地址:https://www.cnblogs.com/jiangyang/p/11422732.html
Copyright © 2011-2022 走看看