31

「每天五分钟,玩转 JVM」:对象访问定位

 4 years ago
source link: http://www.cnblogs.com/viyoung/p/12550134.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

前言

在「对象内存布局」一节中,我们了解到对象头中包含了一个叫做 类型指针 的东西,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。但是,并不是所有的虚拟机都是这么去做的。不同的虚拟机关于这点有不同的实现,目前主流的方式可以分为 句柄直接指针

句柄

BvUzY3r.png!web

由图中我们可以看到,在我们的堆中被划分出了一块单独的部分,叫做 句柄池 ,句柄池的作用就像一个中转站,我们要查询位于 内存中的 对象实例数据 ,需要通过一次 间接 的索引去获取,而另一部分是指向 方法区 中的 对象类型 的指针。而此时JVM栈中的栈帧中的本地变量表中所存储的引用地址 是这个对象所对应的句柄地址 ,而非对象本身的地址。

直接指针访问

zMve6zI.png!web

由上图中,我们可以看到, reference 指针直接指向的就是对象实例数据,而对象实例数据中(对象头)包含了对象类型的数据指针,指向的是位于方法区中的对象类型数据。

对比

从稳定性上来说,句柄访问定位更胜一筹,因为在我们发生 GC 的时候,对象的实例数据指针会发生变化,而 reference 却不会发生任何的改变。

而从时间的角度来考虑,直接指针访问无疑更胜一筹,因为少了一次指针定位的时间开销,而我们使用的 HotSpot 虚拟机也是使用的这种方式来定位对象,毕竟速度是王道~

公众号

3qYBNzq.jpg!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK