JVM虛擬機:三分鐘帶你瞭解玩轉“對象訪問定位”


前言

在「對象內存佈局」一節中,我們瞭解到對象頭中包含了一個叫做類型指針的東西,即對象指向它的類元數據的指針,虛擬機通過這個指針來確定這個對象是哪個類的實例。但是,並不是所有的虛擬機都是這麼去做的。不同的虛擬機關於這點有不同的實現,目前主流的方式可以分為句柄直接指針

句柄

JVM虛擬機:三分鐘帶你瞭解玩轉“對象訪問定位”

由圖中我們可以看到,在我們的堆中被劃分出了一塊單獨的部分,叫做句柄池,句柄池的作用就像一箇中轉站,我們要查詢位於內存中的對象實例數據,需要通過一次間接的索引去獲取,而另一部分是指向方法區中的對象類型的指針。而此時JVM棧中的棧幀中的本地變量表中所存儲的引用地址是這個對象所對應的句柄地址,而非對象本身的地址。

直接指針訪問

JVM虛擬機:三分鐘帶你瞭解玩轉“對象訪問定位”

由上圖中,我們可以看到,reference指針直接指向的就是對象實例數據,而對象實例數據中(對象頭)包含了對象類型的數據指針,指向的是位於方法區中的對象類型數據。

對比

從穩定性上來說,句柄訪問定位更勝一籌,因為在我們發生 GC 的時候,對象的實例數據指針會發生變化,而 reference 卻不會發生任何的改變。

而從時間的角度來考慮,直接指針訪問無疑更勝一籌,因為少了一次指針定位的時間開銷,而我們使用的 HotSpot 虛擬機也是使用的這種方式來定位對象,畢竟速度是王道~


分享到:


相關文章: