《深入理解Java虚拟机》—— 对象的创建与定位

对象的创建与定位

《深入理解Java虚拟机》—— 对象的创建与定位

对象的创建

对象在堆内存中的存储布局主要分三块:对象头,实例数据,对齐填充

  1. 对象头包括两部分: 1) Mark Work: 包含哈希码,GC分代年龄等自身信息;2) 类型指针:虚拟机通过这个指针确定这个对象是哪个类的实例。
  2. 实例数据:代码中所定义的各字段内容,包括从父类继承的
  3. 对齐填充:注意这一块不是必须存在的,仅起到占位符的作用。HotSpot要求对象大小必须是8的整数倍,所以若前二者加起来占的内存和不是8的整数倍时,就需要对齐填充补全内存,使之成为8的整数倍。

对象的定位

Java程序通过栈上的一个引用来定位到堆上的对象,定位的方式有两种:句柄,直接指针

  1. 句柄:堆中会划分出一块句柄池,栈中的某个引用存的是其实是对象的句柄地址,句柄地址中包含了对象的实例地址与对象类类型数据地址。其好处是当对象被频繁移动时,修改的只是句柄中的对象实例地址,而引用本身不变。《深入理解Java虚拟机》—— 对象的创建与定位
  2. 直接指针:直接存储对象的实例地址(HotSpot采用这种方式)。其好处是节省了一次指针定位的时间开销,速度快
    《深入理解Java虚拟机》—— 对象的创建与定位