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

2019-11-12 16:19:24 浏览数 (1)

Hello艾瑞巴蒂~I'm back!这两天收到了一位朋友的来信:

博主表示看到有人这么说内心真的很激动,能对大家有所助益就是我原创最大的动力!另外官宣一下,博主考试结束,正式回归发文状态!以后每周不定期更新1-2篇,敬请大家多多关注~话不多说正文来干~

前言

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

句柄

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

直接指针访问

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

对比

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

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

后续

先来一小篇熟悉一下节奏,下面又开始进入高产阶段,大家有什么想看的内容或者技术交流随时加我微信号(cm_950825)。let's go!

0 人点赞