一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情。
Java对象头内存布局
之前面试被问到 Object object = new Object() 谈谈你对这句话的理解? 按照jdk8的情况下,new 一个对象占多少内存空间?
位置所在:JVM里堆->新生区->伊甸园区
周志明老师JVM第三版
对象在堆内存中的存储布局
对象头:
①对象标记Mark Word:默认存储对象的HashCode、分代年龄和锁标志位等信息。这些信息都是与对象自身定义无关的数据,所以MarkWord被设计成一个非固定的数据结构以便在极小的空间内存存储尽量多的数据。它会根据对象的状态复用自己的存储空间,也就是说在运行期间MarkWord里存储的数据会随着锁标志位的变化而变化。
②类元信息(又叫类型指针):对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。
在64位系统中,Mark Word占了8个字节,类型指针占了8个字节,一共是16个字节。
实例数据:
存放类的属性(Field)数据信息,包括父类的属性信息,如果是数组的实例部分还包括数组的长度,这部分内存按4字节对齐。
对其填充
虚拟机要求对象起始地址必须是8字节的整数倍。填充数据不是必须存在的,仅仅是为了字节对齐这部分内存按8字节补充对齐。
markword(64位)分布图,对象布局、GC回收和后面的锁升级就是对象标记MarkWord里面标志位的变化
①先引入jol-core依赖,是org.openjdk.jol的,作用是分析对象在JVM的大小和分布
OFFSET:偏移量,也就是到这个字段位置所占用的byte数
SIZE:后面类型的字节大小
TYPE:是Class中定义的类型
DESCRIPTION:DESCRIPTION是类型的描述
VALUE:VALUE是TYPE在内存中的值
GC年龄采用4位bit存储,最大为15,例如MaxTenuringThreshold参数默认值就是15
不压缩就15,开启压缩就是12
-XX:+UseCompressedClassPointers