1. 程式人生 > >Java——(JVM)物件的訪問定位

Java——(JVM)物件的訪問定位

古時候,皇帝選妃,自然是為了臨幸。而建立物件,自然是為了使用物件。

我們的Java程式需要通過棧上的reference資料來操作堆上的具體物件,這是眾所周知的。

但是由於reference型別在Java虛擬機器的規範中只規定了一個指向物件的引用,並沒有定義這個引用該通過何種方式去定位、訪問堆中的物件的具體位置,所以物件訪問方式也是取決於虛擬機器實現而定的。

那麼該怎麼去訪問物件呢?

目前主流的訪問方式有兩種,分別是:控制代碼和直接指標。

1.使用控制代碼訪問

如果使用控制代碼訪問的話,就需要一個地方存放控制代碼,放哪好呢?自然是Java堆做這個冤大頭最合適了。於是Java堆中劃分出一塊記憶體來當做控制代碼池。

有了控制代碼,reference儲存的就是物件的控制代碼地址,而控制代碼中包含了物件例項資料與型別資料各自的具體地址資訊。

下面給大家畫個圖,讓大家好理解一些。

咳咳......不好意思......放錯了......

 

注:指向常量池用的是控制代碼。

2.通過直接指標訪問

如果通過直接指標訪問,那麼Java堆物件的佈局中就必須要考慮如何放置訪問型別資料的相關資訊,而reference中儲存的直接就是物件地址。

如下圖所示:

注:指向方法區用的是直接指標。 

 3.兩種方式的對比

 這兩種物件訪問方式各有優勢,使用控制代碼來訪問的最大好處就是reference中儲存的是最穩定的控制代碼地址,在物件被移動(垃圾收集時移動物件是非常普遍的行為)時只會改變控制代碼中的例項資料指標,而reference本身不需要修改

使用直接指標訪問方式的最大好處就是速度更加快,它節省了一次指標定位的時間開銷,由於兌現搞定訪問在Java中非常頻繁,因此這類開銷積少成多後也是一種非常可觀的執行成本。

對於我們常用的Sun HotSpot而言,它就是使用直接指標進行物件訪問的。不過從整個軟體開發的範圍來看呢,各種語言和框架使用控制代碼來訪問的情況也很常見。

至於到底是用哪一種方式,就見仁見智了,畢竟——

誰知道皇帝今夜要臨幸哪一位妃子呢,當然是把所有妃子的牌牌呈給他讓他自己翻去吧~

 

好啦,以上就是今天的知識總結,如果大家有什麼疑問或者發現文中有什麼描述不對的地方,歡迎大家留言評論,我們一起學習呀~~

 

Biu~~~~~~~~~~~~~~~~~~~~宫å´éªé¾ç«è¡¨æå|é¾ç«gifå¾è¡¨æåä¸è½½å¾ç~~~~~~~~~~~~~~~~~~~~~~pia!