对象内存布局
在Hotspot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头、实例数据、对齐填充。
对象头
在64为系统中,Mark word 占了8个字节,cla ss Pointer 占了8个字节。从jdk1.8开始,存在指针压缩,class Pointer 占4个字节。
jvm默认开启的:-XX:+UserCompressedClassPointers 压缩指针
对象标记 Mark Word
存储着:hash码、gc标记、gc次数(年龄)、同步锁标记、偏向锁持有者
gc的分代年龄只有4位,所以最大年龄15
类元信息(类型指针class Pointer)
类元信息就是new 某个对象的模板,即ObjectDemo1 o1 = new ObjectDemo1(); 的ObjectDemo1。 里面的属性为实例数据。
对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是那个类的实例。
class Resouce{ //只含对象头
}
class Book{//有实例数据,16字节(忽略指针压缩)+ 4字节 + 1字节 = 21字节,由于对齐填充为24字节
int id;
boolean flag;
}
实例数据
存放类的属性(field)数据信息,包括父类属性信息。文章来源:https://www.toymoban.com/news/detail-660494.html
对齐填充
虚拟机要求对象起始地址必须是8字节的整数倍。它的存在不是必须的,仅仅是为了字节对齐这部分内存按照8字节补充对齐。文章来源地址https://www.toymoban.com/news/detail-660494.html
到了这里,关于对象内存布局与对象头的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!