对象的创建
- 1.虚拟机遇到一条new指令,首先检查该类是否加载,否则先执行类加载过程。
- 2.类加载检查通过,虚拟机将会为对象分配内存,内存分配完毕,然后就进行一些必要的设置,例如这个对象是哪个类的实例,如何才能找到类的元数据信息,对象的哈希吗,对象的GC分代年龄信息等。这些信息放在对象的对象头中。
- 执行init方法,把对象按照程序员的意愿进行初始化,至此,完整可用的对象完全产生。
对象的内存布局
- 对象头
- 实例数据
- 对齐填充
1.对象头
对象头分2部分,第一部分用于存储对象自身的运行时数据,如哈希码、GC年龄、锁状态、偏向线程ID等等,官方称之为Mark Word;第二部分是类型指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。
2.实例数据部分
无论父类继承下来的还是子类中定义的,都存在这里。
3.对齐填充
HotSpot VM要求对象大小必须是8字节的整数倍。
对象的访问定位
主流的访问方式有2种,句柄和直接指针访问。
1.句柄
一个引用指向句柄池,池中存储对象指针和对象类型指针。注意:句柄池存储于堆中。
2.直接指针
引用直接指向对象,对象中需要额外存储空间来存储对象类型信息。