Mark Word结构详解及分析对象在内存占用大小

1. Mark Word结构

  1. 不同锁状态下32位Mark Word的结构信息
    不同锁状态下32位Mark Word的结构信息
  2. 不同锁状态下64位Mark Word的结构信息
    不同锁状态下64位Mark Word的结构信息
    如上图lockbiased_lock两个标记位组合在一起共同表示Object实例处于什么样的锁状态
具体解释
  1. lock:锁状态标记位,占两个二进制位,由于希望用尽可能少的二进制位表示尽可能多的信息,因此设置了lock标记
  2. biased_lock:对象是否启用偏向锁标记,只占1个二进制位。为1时表示对象启用偏向锁,为0时表示对象没有偏向锁
  3. age:4位的Java对象分代年龄。在GC中,对象在Survivor区复制一次,年龄就增加1。当对象达到设定的阈值时,将会晋升到老年代。默认情况下,并行GC的年龄阈值为15,并发GC的年龄阈值为6。由于age只有4位,因此最大值为15,这就是-XX:MaxTenuringThreshold选项最大值为15的原因
  4. identity_hashcode:31位的对象标识HashCode(哈希码)采用延迟加载技术,当调用Object.hashCode()方法或者System.identityHashCode()方法计算对象的HashCode后,其结果将被写到该对象头中。当对象被锁定时,该值会移动到Monitor(监视器)中。
  5. thread:54位的线程ID值为持有偏向锁的线程ID。
  6. epoch:偏向时间戳

2. 对象在内存中占用大小

2.1 对象结构

在这里插入图片描述

2.1.1 结构解释
  1. 对象头
  • metadata:Klass 简单来说就是 Java 类在 HotSpot 中的 C++ 对等体,主要用于描述对象实例的具体类型。一般 JVM 在加载 class 文件时,会在方法区创建 Klass ,表示类的元数据,其包括常量池、字段、方法等。根据是否开启压缩(默认开始,可以手动修改)占用4或8字节。
  • [array length]:如果对象包含数字类型,这里会有占用,反之,没有不占用。
  1. 实例对象
    在这里插入图片描述
  2. 对象补齐:关于对齐填充,Java 对象的大小默认是按照 8 字节对齐,也就是说 Java 对象的大小必须是 8 字节的倍数。若是算到最后不够 8 字节的话,那么就会进行对齐填充

实际大小:对象头+实例数据+对象填充

2.2 举例String占用内存大小计算

JDK1.8 String 结构:

private final char value[];
 
/** Cache the hash code for the string */
private int hash; // Default to 0
 
/** use serialVersionUID from JDK 1.0.2 for interoperability */
private static final long serialVersionUID = -6849794470754667710L;

在 Java 里数组也是对象,因而数组也有对象头,故一个数组所占的空间为对象头所占的空间加上数组长度加上数组的引用,即 8 + 4 + 4= 16 字节 。

那么一个空 String 所占空间为:

对象头(8 字节)+ 引用-metadata (4 字节 ) + char 数组(16 字节)+ 1个 int(4字节)+ 1个long(8字节)= 40 字节。

String占用内存计算公式40 + 2*n,n为字符串长度。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值