二、Java 对象的结构
1.Header(对象头)
- 自身运行时数据 (Mark Word)
- 哈希值 Object 的hashCode() 是native修饰的 | GC分代年龄 | 锁状态标志 | 线程持有的锁 | 偏向线程ID | 偏向时间戳
- 类型指针
2、InstanceData
无论是从父类继承来的还是子类定义的,都在这里。这部分的存储顺序会受到存储策略,和字段在Java源码中定义的顺序的影响。HotSpot虚拟机默认的分配策略,是相同的宽度的字段被分配到一起。
eg: long double 可能被分配到一块,short 和char 被分配到一块儿。
在满足这个前提之下,父类中定义的变量可能会出现在子类变量之前。
3、Padding(填充,无实际意义)
HotSpot要求对象的大小必须是8个字节的整数倍,而对象头部分正好是8个字节的整数倍,因此对象实例数据部分如果没有对齐时就需要通过padding补位
三、对象的访问定位
使用句柄
使用指针
栈内存中的引用指向对内存的区域,这么说不够严谨。
在Java虚拟机的规范中,这个栈中的引用类型,仅仅是规定了一个指向对象的引用。并没有定义这个引用对象应该通过何种方式去定位访问堆中的具体位置。
确实是引用了一块堆内存中的区域,但是这个区域是否就一定是这个对象呢?不一定!既可以是对象本身,也可以是其它的一块儿内存区域