Java虚拟机中对象的内存布局
对象在内存中存储的布局分为三个部分
- 对象头
- 实例数据
- 对齐填充
对象头
对象头包含两部分的信息
- 存储对象自身的运行时数据,如哈希码,GC分代年龄,锁状态标志,线程持有的锁等等。
- 类型指针,即对象指向他的元数据的指针,虚拟机通过这个指针确定对象属于哪个类的实例并不是所有的虚拟机实现都必须在对象数据上保留类型指针,另外如果对象是一个数组,对象头还必须有一块记录数组长度的数据。
实例数据
实例数据部分是对象真正存储的有效信息,也是在java代码中锁定义的各种类型的字段的内容。无论是从父类中继承的还是从子类中定义的都必须记录下来。
存储顺序受java虚拟机的分配策略跟字段在java源码中定义的顺序有关。相同长度的分配在一起,在满足这个前提条件下父类中定义的变量出现在子类中定义的变量的前面。
对齐填充
对齐填充并不是必然存在的,也没有特别的含义,仅仅起着占位符的作用。对象的大小必须是8字节的整数倍,对象头正好是8字节的整数倍,当实例数据部分没有对齐的时候,就需要通过对齐补充来补全。