对象在堆上创建。
对象的创建包括以下几步:
1 分配内存 。包括两种方式,指针碰撞(Bump the Point ),空闲列表(Free List)。如果 虚拟机自己支持 压缩内存的话,分配方式是 指针碰撞。为了保证线程安全,先预先给线程分配空间。称为TLAB(Thread local Allocation Buffer)。
2 初始化为零值(便于Java代码中不赋予初始值就可以使用)
3虚拟机设置对象头给对象(元数据,对象的哈希码,分配的GC年龄)
4执行<init>方法。
对象在内存中的布局分布
1 对象头。存jvm需要的对象的信息。
2 实例数据。就是代码产生象信息。
3 占位符。jvm 要求起始地址必须是8的整数倍。
对象的访问定位
1 句柄访问。 reference 到 句柄 到 对象。 句柄里放对象地址。
2 直接访问。 reference 到 对象。
句柄,如果对象地址改动,不用更改reference 的值,只改变句柄里的值。这里 改变句柄里的代价 肯定要远小于改变reference的代价。不然没必要。