「每日五分鐘,玩轉 JVM」:對象訪問定位
- 2019 年 11 月 12 日
- 筆記
Hello艾瑞巴蒂~I'm back!這兩天收到了一位朋友的來信:

部落客表示看到有人這麼說內心真的很激動,能對大家有所助益就是我原創最大的動力!另外官宣一下,部落客考試結束,正式回歸發文狀態!以後每周不定期更新1-2篇,敬請大家多多關注~話不多說正文來干~

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

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

由上圖中,我們可以看到,reference指針直接指向的就是對象實例數據,而對象實例數據中(對象頭)包含了對象類型的數據指針,指向的是位於方法區中的對象類型數據。
對比
從穩定性上來說,句柄訪問定位更勝一籌,因為在我們發生 GC 的時候,對象的實例數據指針會發生變化,而 reference 卻不會發生任何的改變。
而從時間的角度來考慮,直接指針訪問無疑更勝一籌,因為少了一次指針定位的時間開銷,而我們使用的 HotSpot 虛擬機也是使用的這種方式來定位對象,畢竟速度是王道~
後續
先來一小篇熟悉一下節奏,下面又開始進入高產階段,大家有什麼想看的內容或者技術交流隨時加我微訊號(cm_950825)。let's go!