七、对象
稀掘星球的朋友们,前面讲到方法区,堆实例对象数据通过到对象类型的指针指向方法区,那么JVM的设计者们是如何设计做到的呢,让我们知其然知其所以然,一探到底。
(一) 对象的实例化
我们开发过程中最常见的当然就是new一个对象啦,其他的我这里也整理了下
- class的newInstance() 反射的方法,不过JDK1.8之后变成了 constructor的newInstance() 方法
- 使用clone复制对象
- 通过反序列化的方式 那么具体如何创建呢,这里采取了六步走的步骤
- 判断对象对应的类是否加载、链接、初始化
- 为对象分配内存
- 处理并发安全问题
- 默认初始化
- 设置对象头的信息
- 执行init方法进行初始化
(二) 对象的内存布局
对象在堆中的内部构成是如何的呢,它由三大部分组成,对象头、实例数据、对齐填充,结合图示
(三) 对象访问定位
JVM又是如何通过栈桢中的对象引用访问到其内部的实例对象的呢?目前的话有两种方式,一种是句柄访问,另一种是采用直接指针的方式,这一种也是目前hotSpot虚拟机采用的。
- 直接指针
- 句柄访问 需要在堆空间中开辟一块句柄空间,会占用多一份空间,好处就是对象修改只需要改变句柄对象的指针