JVM(四):对象是如何被访问的?

上篇文章中我们讲到了  对象是如何被创建的以及在堆中的空间是如何被分配的,这章呢?咱们来说说这个堆中的对象是怎么被访问的。

其实要想去访问对象有以下两种方式:

1.直接指针访问

 

JVM(四):对象是如何被访问的?

在虚拟机栈中呢,会有一个叫做局部变量表的东东,这里边呢有个reference的引用类型存储了指向了堆中的一个地址(对象在堆中的地址),堆中的这个地址呢会有2种类型的数据,分别是实例数据跟类型数据,实例数据直接存放在堆中,实例数据存在方法区中。直接指针访问相当于一级指针,直接就指向了对象在堆中存放的地址。

 

2.句柄访问

JVM(四):对象是如何被访问的?

 对于这个句柄访问对象的方式,其实就相当于一个二级指针,先从局部变量表中的引入类型出发,先指向堆中的句柄池,在句柄池中存放着每个对象实例数据跟类型数据的引用,跟上面直接指针访问的不同点在于对象实例数据并不是直接就被局部变量表里的引用指到,而是通过先指到句柄池,再由句柄池指向实例数据在堆中具体的地址。

 优缺点对比:

访问效率:直接指针访问优于句柄访问,直接指针指一次就能找到,花费的时间也少,所以相对要效率高,Hotspot采用的就是这种方式

内存回收:句柄访问优于直接指针访问,首先,reference中指向的地址是稳定的,如果我们要回收对象的话,直接修改对象在句柄中的地址即可。