一个Java对象被初始化之后会存储在堆内存中,那么这个对象在堆内存中存储了哪些信
呢?
Java 对象存储结构可以分为三个部分:对象头、实例数据、对齐填充。当我们构建一个0b
lock = new Object() 对象实例时,这个1ock实例最终的存储结构就对应下面这个的模型。
- 对象头
java中对象头有三个部分组成:Mark Word、Klass Pointer、Length
- 图解分析对象的实际存储
看这个程序
public class MarkWordExample {private int id;private String name;public static void main(string[]args){MarkWordExample example=new MarkWordExample();}
}
从上述代码中可以看到,在main()方法中定义了MarkWordExample对象实例,并且该对象含两个成员变量:id和name。在mainO)方法运行之后,就会形成下面这个图
对象在内存中的存储结构
- 通过 ClassLayout 查看对象内存布局
想要直观看到一个对象的内存布局信息,OpenJDK官方提供了一个JOL (Java Object Layout)工具,用Maven依赖引入
- 关于压缩指针
在默认打印的对象内存布局信息中,Klass Pointer被压缩成4字节,如果不希望开启压缩指针功能,加一个jvm参数 --XX:UseCompressedOops