JVM中对象的内存布局

JVM中对象的内存布局

简单介绍对象的内存布局


对象的内存分布

JVM中对象的内存布局


说明:

1. 对象头

  1. Mark Word 非固定结构,32位虚拟机占32位,64位虚拟机占64位(占64位条件是没有开启压缩指针
  2. 类型指针,并非一定要有,与对象访问方法有关
  3. 如果是数组,无法通过元数据信息确定java对象大小,这个时候就需要记录长度。

2. 实例数据: 真正有效的数据

存储顺序受下面两种情况影响

  1. 分配策略参数(FieldsAllocationStyle)
  2. 字段在在Java中定义的顺序

HotSpot默认分配策略

longs/doublesintsshorts/charsbytes/booleanoops(ordinary object pointers)

相同宽度的字段总是被分配到一起

  • 在满足这个条件下,父类中定义的变量会出现在子类之前。

  • 如果CompactFields参数为ture(默认为true),那么子类之中较窄的变量也会插入到父类变量的空隙之中


3.对齐填充:占位符的作用

HotSpotVM的自动内存管理系统要求对象起始地址必须是8字节的整数倍,也就是要求对象的大小必须是8个字节的倍数


参考:

1.《深入理解java虚拟机》–周志明
2. Java对象创建的过程及对象的内存布局与访问定位