「每天五分鐘,玩轉 JVM」:物件訪問定位
阿新 • • 發佈:2020-03-23
### 前言
在「物件記憶體佈局」一節中,我們瞭解到物件頭中包含了一個叫做**型別指標**的東西,即物件指向它的類元資料的指標,虛擬機器通過這個指標來確定這個物件是哪個類的例項。但是,並不是所有的虛擬機器都是這麼去做的。不同的虛擬機器關於這點有不同的實現,目前主流的方式可以分為**控制代碼**和**直接指標**
### 控制代碼
由圖中我們可以看到,在我們的堆中被劃分出了一塊單獨的部分,叫做**控制代碼池**,控制代碼池的作用就像一箇中轉站,我們要查詢位於**堆**記憶體中的**物件例項資料**,需要通過一次**間接**的索引去獲取,而另一部分是指向**方法區**中的**物件型別**的指標。而此時JVM棧中的棧幀中的本地變量表中所儲存的引用地址**是這個物件所對應的控制代碼地址**,而非物件本身的地址。
### 直接指標訪問
由上圖中,我們可以看到,**reference**指標直接指向的就是物件例項資料,而物件例項資料中(物件頭)包含了物件型別的資料指標,指向的是位於方法區中的物件型別資料。
### 對比
從穩定性上來說,控制代碼訪問定位更勝一籌,因為在我們發生 GC 的時候,物件的例項資料指標會發生變化,而 reference 卻不會發生任何的改變。
而從時間的角度來考慮,直接指標訪問無疑更勝一籌,因為少了一次指標定位的時間開銷,而我們使用的 HotSpot 虛擬機器也是使用的這種方式來定位物件,畢竟速度是王道~
### 公眾號
![](http://viyoungblog.oss-cn-beijing.aliyuncs.com/viyoung/2020-03-15-qrcode_for_gh_a65beceb0947_