JVM中对象的内存布局
JVM中对象的内存布局
简单介绍对象的
内存布局
对象的内存分布
说明:
1. 对象头
- Mark Word 非固定结构,32位虚拟机占32位,64位虚拟机占64位(占64位条件是没有开启压缩指针)
- 类型指针,并非一定要有,与对象访问方法有关
- 如果是数组,无法通过元数据信息确定java对象大小,这个时候就需要记录长度。
2. 实例数据: 真正有效的数据
存储顺序受下面两种情况影响:
- 分配策略参数(FieldsAllocationStyle)
- 字段在在Java中定义的顺序
HotSpot默认分配策略:
longs/doubles
、ints
、shorts/chars
、bytes/boolean
、oops(ordinary object pointers)
相同宽度的字段总是被分配到一起;
在满足这个条件下,父类中定义的变量会出现在子类之前。
如果
CompactFields
参数为ture
(默认为true),那么子类之中较窄的变量也会插入到父类变量的空隙之中
3.对齐填充:占位符的作用
HotSpotVM的自动内存管理系统要求对象起始地址必须是8
字节的整数倍,也就是要求对象的大小必须是8
个字节的倍数,
参考:
1.《深入理解java虚拟机》–周志明
2. Java对象创建的过程及对象的内存布局与访问定位