如下一句代码:
Object obj = new Object();
可以用一图表明:对象的引用放到了栈 里,对象的实例存储在堆里。
引用类型只规定了一个指向对象的引用。那它是如何通过这个引用找到在java堆中对象的实例呢?
不同的虚拟机有不同的方式。主流的有两种:
使用句柄
在java堆中开辟了一块内存作为句柄池。reference 类型存储的是对象的句柄地址,
句柄中包含了对象实例的指针。
直接使用指针
可以看到的是reference 中直接就存储了对象的地址。
各自的优势比较:
一、句柄方式最大的好处就是在对象改变位置的时候(这种情况在垃圾回收时是常有的),reference的句柄地址不需要改变。只会更改句柄的对象实例的指针。
二、直接使用指针最大的好处就是速度更快。因为它可以一步定位到实例对象。
就大范围使用情况来说,直接使用指针的方式是十分常见的。