对象头中包含了哪些部分?

117 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 7 天,点击查看活动详情

对象头中包含了哪些部分?

在我们工作中最常见的 HotSpot 虚拟机当中对象在内存中的存储的布局主要可以分为3块区域:
1、对象头(Header)
2、实例数据(Instance Data)
3、对象填充(Padding) 大概的情况是下面这个样子

image.png

首先在对象中有对象头,那么对象头中又对应有以下几种数据:
1、如果只是一个对象的话不是一个对象数组的话,那么就会有一个存储对象自身的运行时数据也就是 Mark Word,比如我们对象的 hash 码,比如我们对象的GC分代年龄,或者说对象的锁状态,再或者是线程持有的锁,除此之外还有偏向线程ID、偏向时间戳这一系列内容,具体需要看对象的使用方式
2、然后对象头中会有一个类型指针,就是指对象指向它的类元数据的指针,就是说我们对象都是通过类创建的,类型指针就是指向这个对象是通过哪个类创建的,jvm 就是通过这个指针来确定这个对象是哪个类的实例。
3、还有就是如果对象是一个 java 的数组的话,那么对象头中还有一块用于记录这个数组长度的数据。类似于就像我们在创建一个 arr 数组的时候,如果我们要获取它的长度大小时通过 size() 方法去获取它的这个长度大小一样。

要了解对象头的话首先就是需要知道一个对象里面有一个对象头,对象头中主要有 Mark Word、类型指针,如果是数组的话呢还会有一个用于专门记录数组长度的数据。
以上这三块就是对象头中主要包含的部分。