深入理解JVM之探索对象结构

15 篇文章 1 订阅

我们都知道现在高级语言都是面向对象思想,不管是用实例化创建对象还是使用工厂生产实例,你真的了解你的对象吗?之前的博文中已经介绍过对象的创建了,大家可以自己去翻看,我们这篇博文就简单介绍一下我们的对象,看看它的结构是怎样的。

首先从以下三部分展开,对象头(Header),实例数据域(InstanceData),配置填充(padding):


对象头

对象头存储对象的原数据。对象中主要有两部分内容,一个是自身运行时数据,它包括对象的哈希值,GC分代年龄,锁状态标志,线程持有锁,偏向线程ID,偏向时间戳等;GC分代算法会根据对象的不同,把对象分为不同的类别,比如新生代或者老年代等,这样将对象分成不同的类别,方便虚拟机在进行垃圾回收的时候选择合适的垃圾回收策略。锁状态标志就与多线程密切相关了。自身运行时数据所占的内存根据设备的位数不同占32/64位。

以HotSpot虚拟机为例,看一下该虚拟机中对象头的存储形式:

另一个是类型指针。用于对象的访问定位,根据指针获取对象的原数据以及确定该对象是属于哪一个类的。


InstanceData

实例数据区是实际存放对象有效数据的区域。不管是从父类继承的或者是在子类中新定义的数据,都需要记录在该区域。数据在该区的存储顺序会受到虚拟机的存储策略和字段在Java掩码中定义的顺序的影响。就以HotSpot为例,在虚拟机中,相同宽度的字段会被分配到一起。比如Long类型或者Double类型的数据会被分配到一起。这样的话,在父类中定义的变量可能会出现在子类之前。

 


Paddintg

填充对齐,没有什么具体的意义,充当占位符。

为什么需要占位符呢?HotSpot虚拟机要求对象的起始位置必须是8的整数倍。也就是说对象的大小必须是8的整数倍,而上面说到对象头部是32位或者64位,对象实例域的大小不一定是8位,所以需要占位符进行填充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值