《深入理解Java虚拟机》—— 对象的创建与定位
对象的创建与定位
对象的创建
对象在堆内存中的存储布局主要分三块:对象头,实例数据,对齐填充
- 对象头包括两部分: 1) Mark Work: 包含哈希码,GC分代年龄等自身信息;2) 类型指针:虚拟机通过这个指针确定这个对象是哪个类的实例。
- 实例数据:代码中所定义的各字段内容,包括从父类继承的
- 对齐填充:注意这一块不是必须存在的,仅起到占位符的作用。HotSpot要求对象大小必须是8的整数倍,所以若前二者加起来占的内存和不是8的整数倍时,就需要对齐填充补全内存,使之成为8的整数倍。
对象的定位
Java程序通过栈上的一个引用来定位到堆上的对象,定位的方式有两种:句柄,直接指针
- 句柄:堆中会划分出一块句柄池,栈中的某个引用存的是其实是对象的句柄地址,句柄地址中包含了对象的实例地址与对象类类型数据地址。其好处是当对象被频繁移动时,修改的只是句柄中的对象实例地址,而引用本身不变。
- 直接指针:直接存储对象的实例地址(HotSpot采用这种方式)。其好处是节省了一次指针定位的时间开销,速度快