Java 对象头那点事

本文介绍了Java对象头的结构,包括mark word、klass point和length field。对象头用于存储堆对象的布局、类型、GC状态、同步状态和哈希码。mark word在不同锁状态下有不同的值,用于轻量级锁和重量级锁的状态表示。klass point指向方法区的instanceKlass,确定对象所属类。length field仅存在于数组对象中,表示数组长度。对象头的设计与内存对齐、缓存行策略及锁的状态紧密相关。
摘要由CSDN通过智能技术生成

概览


  • 对象头
    存放:关于堆对象的布局、类型、GC状态、同步状态和标识哈希码的基本信息。Java对象和vm内部对象都有一个共同的对象头格式。
    (后面做详细介绍)

  • 实例数据
    存放:类的数据信息,父类的信息,对象字段属性信息。
    如果对象有属性字段,则这里会有数据信息。如果对象无属性字段,则这里就不会有数据。
    根据字段类型的不同占不同的字节,例如boolean类型占1个字节,int类型占4个字节等等;

  • 对齐填充
    存放:为了字节对齐,填充的数据,不是必须的。
    默认情况下,Java虚拟机堆中对象的起始地址需要对齐至8的倍数。
    假如对象头大小为12,实例数据大小为5,最近且大于12+5的8的倍数值是24,则对齐补充大小为:24-12-5=7。


为什么需要对象填充?

①:字段内存对齐的其中一个原因,是让字段只出现在同一CPU的缓存行中。如果字段不是对齐的,那么就有可能出现跨缓存行的字段。也就是说,该字段的读取可能需要替换两个缓存行,而该字段的存储也会同时污染两个缓存行。这两种情况对程序的执行效率而言都是不利的。其实对其填充的最终目的是为了计算机高效寻址。

②:在计算机系统中,内存是以【缓存行】为单位存储的,一个缓存行存储的字节是2的倍数。不同机器上,缓存行大小也不一样,通常来说为64字节。

对象头

mark word

OpenJDK(JDK8)地址:GitHub - openjdk/jdk: JDK main-line development
根据OpenJDK 官方源码中MarkOop.hpp文件中给的注释介绍,可以大概看出mark word的组成。

MarkOop.hpp中的注释1:

<span style="background-color:#f5f5fa"><span style="color:#333333">32 bits:
--------
           hash:25 ------------>| age:4    biased_lock:1 lock:2 (normal object)
           JavaThread*:23 epoch:2 age:4    biased_lock:1 lock:2 (biased object)
           size:32 ------------------------------------------>| (CMS free block)
           PromotedObject*:29 ---------->| promo_bits:3 ----->| (CMS promoted object)

64 bits:
--------
           unused:25 hash:31 -->| unused:1   age:4    biased_lock:1 lock:2 (normal object)
           JavaThread*:54 epoch:2 unused:1   age:4    biased_lock:1 lock:2 (biased object)
           PromotedObject*:61 --------------------->| promo_bits:3 ----->| (CMS promoted object)
           size:64 ------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值