https://juejin.cn/post/6844903817897574407
就像创建自然世界的人主要目的就是活着,创建计算机世界的对象主要是为了使用它。Java 对象保存在堆上的,而它的引用主要保存在栈上,引用中存放的是对象在堆中的地址。这句话也对也不对,不对在后半句,引用中存放的是啥要看虚拟机访问对象方式的具体实现,主流的有以下两种:
这种方案的好处是引用保存的是稳定的句柄地址,在对象在内存中被移动的时候,只需要修改句柄中的实例数据指针即可,无需修改 reference。
• 直接指针:reference 中保存的是对象实例数据,与大部分人理解的一致。此时,对象的类型数据指针放到 Mark Word 中去(不理解的可以回看对象头的介绍)。具体的访问流程图如下:
这种方案的好处是速度更快,它节省了一次指针定位的时间开销,由于对象的访问在Java中非常频繁,因此这类开销积少成多后也是一项非常可观的执行成本。
这下别人再问你 reference 中保存的是什么的时候,别急着回答说是对象的地址哦,也有可能是对象地址的地址。