题目
如何在堆中找到某个对象的具体位置(对象的访问定位)
解释
类似问法如 “介绍下通过 Java 的引用句柄访问对象真实数据的过程”
答案
对象的访问定位方式是由虚拟机 GC 的具体实现来决定的,**保守式 GC** 使用的对象访问定位方式是使用**句柄访问**,**准确式 GC** 使用的对象访问定位方式是**直接指针访问**: - **所谓保守式 GC 就是虚拟机无法识别指针和非指针**(无法识别引用数据类型和基本数据类型),这会导致两个问题,一个就是一些已经死掉的对象无法被回收,占用内存;第二个就是对象无法移动,为了解决这个问题,在堆中引入了【**句柄池**】,**所有引用先指到一个句柄池里**,再从句柄池找到实际对象。这样,要移动对象的话,只要修改句柄池里的内容即可,虚拟机栈中存储的就是对象的句柄地址。这就是使用句柄访问,显然它多了一次间接查找的开销 ![](https://cs-wiki.oss-cn-shanghai.aliyuncs.com/img/20220214110511.png) - **所谓准确式 GC 就是虚拟机准确的知道内存中某个位置的数据具体是什么类型**,具体的实现方式就是使用一个**映射表**(在 HotSpot 中把这种映射表称之为【**OopMap**】)记录下类型信息,虚拟机栈中存储的直接就是对象地址,这样就不需要多一次间接访问的开销了,这就是直接指针访问 现在主流的 Hotspot 虚拟机,基本都是准确式 GC