java对象的内存布局

1. 组成

java对象在内存中的储存布局可以分为:对象头(Object Header)实例数据(Instance Data)以及对齐填充(padding)

1.1 对象头(Object Header)

对象头中储存两类信息

  • 第一类储存的是对象运行时的数据(mark word),。例如:哈希码(HashCode)GC粉黛年龄锁标志状态线程持有的锁偏向锁ID偏向时间戳等,在32和64位虚拟机中分别占32bit64bit,在32位Hot-Spot虚拟机中,对象未被同步锁锁定的情况下,32bit储存空间有25bit储存对象的哈希码4bit储存分代年龄1bit恒为02bit储存锁标志位
NameAcademyscore
对象哈希码、分代年龄01未锁定
指向锁记录的指针00轻量级锁
指向Monitor的指针10重量级锁
空,不需要记录信息11GC标记
偏向线程ID、偏向时间戳、对象分代年龄01偏向锁
  • 第二类储存的是类型指针,即对象指向它的类型的元数据的指针,虚拟机通过这个指针来确定该对象是哪个类型的实例

注意:如果对象是数组,那么还有一块用于记录数组长度的数据,因为普通的java对象可以通过元数据信息判断对象的大小,而数组长度是不确定的,无法通过元数据推断出数组大小。

1.2 实例数据(Instance Data)

实例数据对象真正储存的有效信息,是代码中定义的各种类型的字段内容(包括自己定义的和父类继承的),这部分的储存策略受到分配策略参数-XX:FiledsAllocationStyle和源码定义顺序的影响,默认分配顺序为longs/doublesintsshorts/charsbytes/booleanoops,可以看出宽度相同的字段总是分配到一起存放父类的字段总是在子类字段之前,如果虚拟机参数-XX:CompactFiledstrue(默认就是true),那子类中较窄的变量也可以插入到父类变量的空隙中去,以节省一点点空间。

1.3 对齐填充(padding)

在Hot-Spot虚拟机的自动内管理系统中要求对象的起始地址必须是8字节的整数倍,因此,如果对象的实例数据所占空间不是8字节的整数倍,需要进行对齐填充来补全。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值