new 了一个object 发生了什么?
Object o = new Obejct();
简单的new一个对象也会设计到3个区域的关联关系: java栈,java堆,方法区
大概流程:Object o 会存放到栈中的局部变量表中,它的引用reference 会是堆中的内存地址,new Object() 会在堆中创建一个存放object的结构化内存,此外堆中还会存放该对象的类型数据在方法区的地址信息(对象类型,父类,实现的接口,方法等),而方法区存放的为堆中引用地址的具体数据信息;
两种对象访问方式结构图:
image.png
image1.png
虚拟机规范只是定义了reference对象指向对象的引用,而并没有规范具体怎么去引用,主流引用方式有两种,句柄访问和直接指针访问;
句柄访问原理:reference 对象存放的是对象的句柄池池地址,而句柄中存放的是对象的类型指针(方法区中的类型数据)和对象实例的指针
直接指针访问原理:reference 对象存放的是对象的在堆中的地址;
两种的利与弊:
句柄:reference对象引用的句柄地址,当对象被移动时,只是修改句柄池到对象实例数据的指针,而不会修改reference对句柄池的指针;
直接指针:直接指针的优点就是快,节省了一步句柄指针定位的时间,java对象访问非常频繁,也会省去不小的一份开销;
hotspot使用的为直接指针访问;