JVM 知识-- 指针、引用和句柄

本文最后更新于:12 天前

指针

指针是对象在内存中的地址

引用 (Reference)

对象的引用是创建对象时的返回值,即 new 表达式的返回值。

new A();

这里真正创建了一个对象,但我们没有用句柄去持有(hold,拿着,保存)该引用。Handle 是变量,Reference 是一种变量值。

句柄 (Handle)

句柄是指针的指针

对象句柄

A a = new A();

a 就是对象句柄

new A(); 返回值是对象引用

a = new A() 完成了 句柄=引用 的过程,即句柄的初始化

JVM 中对象访问句柄 (JVM 底层实现)

通过引用有两种访问对象的方式:

  1. 通过对象句柄访问

    JVM 会在中划分一个句柄池,引用存储的就是在句柄池中一个句柄的地址,而这个句柄包含了对象的实例数据类型数据的具体地址。

    1696617d82f92dcf

    使用这种方式最大的好处在于,如果对象在垃圾回收器不断回收后被移动到了其他地方,句柄本身不会改变,只需要改变句柄中实例数据的指针,提高了垃圾回收的效率

  2. 直接指针访问

    169661805c59091

    引用存储的就是对象的地址,相比上个放法节省了一次指针定位的时间开销。

HotSpot 是使用直接指针的方式访问的