不会找对象?教你两招再试试【适用于Java攻城狮】

我是标题党我先摊牌了,但不影响你因此受益!

一个简洁高效纯输出 360° Java 知识点的博主怎能让你受委屈!不信继续往下看


new 出的对象先由 JVM 进行创建并初始化,此过程完成前的最后一步是将此对象的引用入栈,虚拟机栈中就有了它的对象引用,之后对此对象的引用相关操作均由虚拟机栈发起,并根据此对象引用内记录的信息定位至中具体对象完成具体处理

虚拟机栈中的引用如何定位至堆中的具体对象实例?你已经知道了通过指针记录堆内对象地址的方式完成定位,没错,这确实是其中的一种,实际上这种方式称为直接指针定位, 也是 HotSpot 虚拟机 采用的对象定位策略。但不同虚拟机实现此功能的策略并不相同,今天我们具体的聊聊常见的两种,即:直接指针找对象、句柄池找对象,让你心里透亮透亮

若您有遇到其它相关问题,非常欢迎在评论中留言,本人及全体读者小伙伴们将帮助解决并持续更新至此文,达到帮助更多人的目的。若感本文对您有所帮助请点个赞吧!


直接指针找对象

根据直接指针定位对象是指VM创建完成此对象之初,对象内直接存入对应的堆内地址,之后再将对象入栈。根据此堆内地址,当虚拟栈中对应的对象引用被调用完成某些数据处理时,可直接完成堆内对象定位,优势显而易见是直接高效,同时也是 HotSpot 虚拟机 采用的对象定位策略


句柄池找对象

划分句柄池定位堆内对象是另一种常见方式,是指VM在堆中划分出来并维护一块专门的内存,用于存储句柄,句柄中存储有 Method Area Point(类数据信息指针)Instance Data Point(实例数据指针),句柄通过这两个指针可以获取所需数据。而虚拟机栈内的对象引用此时存储的就是句柄池内对应的句柄地址,由此种方式完成对象定位的优势是当堆内对象被移动时,只需改变句柄池中对应的 Instance Data Point(实例数据指针),不需要更新此对象定位用到的其它相关指针,


若您有遇到其它相关问题,非常欢迎在评论中留言,我和其他读者小伙伴们将帮助解决并持续更新至此文,达到帮助更多人的目的。若感本文对您有所帮助请点个赞吧!

发布了94 篇原创文章 · 获赞 387 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_15609303/article/details/103899341