在 HotSpot虚拟机中,对象在内存中存储的布局分为三块区域:对象头,实例数据,和对齐填充。
对象头包括如下两部分信息:
是对象真正的有效数据,也就是代码中所定义的各种类型的字段内容,无论是从父类继承还是子类记录的都必须进行存储。
对齐填充并不是必然存在的,也没有其它的意义,仅仅是占位符的作用,因为HotSpot虚拟机的自动内存管理系统要求对象地址必须是8的整数倍,当实例数据没有对齐时,就需要对齐填充来进行补齐。
当我们使用对象时,我们需要通过虚拟机栈上的reference数据(即worker)来操作堆上的具体对象。
public Worker buildWorker(){
Worker woker = new Woker();
worker.setAge(21);
....
return worker;
}
访问具体对象的方式不同虚拟机有不同的实现,主流的方式有以下两种
在Java堆中专门划分处一部分内存作句柄池,reference中存储的是对应对象的句柄地址,而句柄池中包含了对象实例数据和类型数据具体的地址信息,如下图:
直接指针访问,reference中直接存储对象地址。