对象头由两部分构成,Mark Word
和Klass Pointer
Mark Word 用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等等,占用内存大小与虚拟机位长一致
Klass Pointer 用于存储对象的类型指针,该指针指向它的类元数据,JVM通过这个指针确定对象是哪个类的实例,为了节约内存可以使用选项-XX:+UseCompressedOops
开启指针压缩
开启该选项后,下列指针将压缩至32位
- 每个Class的属性指针(即静态变量)
- 每个对象的属性指针(即对象变量)
- 普通对象数组的每个元素指针
当然,也不是所有的指针都会压缩,一些特殊类型的指针JVM不会优化,比如指向PermGen的Class对象指针(JDK8中指向元空间的Class对象指针)、本地变量、堆栈元素、入参、返回值和NULL指针等
32位虚拟机对象头结构如下
64位虚拟机对象头结构如下
64位虚拟机开启指针压缩
看不清楚具体可以看如下链接
gist.github.com/arturmkrtch…