Java——(JVM)物件的訪問定位
古時候,皇帝選妃,自然是為了臨幸。而建立物件,自然是為了使用物件。
我們的Java程式需要通過棧上的reference資料來操作堆上的具體物件,這是眾所周知的。
但是由於reference型別在Java虛擬機器的規範中只規定了一個指向物件的引用,並沒有定義這個引用該通過何種方式去定位、訪問堆中的物件的具體位置,所以物件訪問方式也是取決於虛擬機器實現而定的。
那麼該怎麼去訪問物件呢?
目前主流的訪問方式有兩種,分別是:控制代碼和直接指標。
1.使用控制代碼訪問
如果使用控制代碼訪問的話,就需要一個地方存放控制代碼,放哪好呢?自然是Java堆做這個冤大頭最合適了。於是Java堆中劃分出一塊記憶體來當做控制代碼池。
下面給大家畫個圖,讓大家好理解一些。
咳咳......不好意思......放錯了......
注:指向常量池用的是控制代碼。
2.通過直接指標訪問
如果通過直接指標訪問,那麼Java堆物件的佈局中就必須要考慮如何放置訪問型別資料的相關資訊,而reference中儲存的直接就是物件地址。
如下圖所示:
注:指向方法區用的是直接指標。
3.兩種方式的對比
這兩種物件訪問方式各有優勢,使用控制代碼來訪問的最大好處就是reference中儲存的是最穩定的控制代碼地址,在物件被移動(垃圾收集時移動物件是非常普遍的行為)時只會改變控制代碼中的例項資料指標,而reference本身不需要修改
而使用直接指標訪問方式的最大好處就是速度更加快,它節省了一次指標定位的時間開銷,由於兌現搞定訪問在Java中非常頻繁,因此這類開銷積少成多後也是一種非常可觀的執行成本。
對於我們常用的Sun HotSpot而言,它就是使用直接指標進行物件訪問的。不過從整個軟體開發的範圍來看呢,各種語言和框架使用控制代碼來訪問的情況也很常見。
至於到底是用哪一種方式,就見仁見智了,畢竟——
誰知道皇帝今夜要臨幸哪一位妃子呢,當然是把所有妃子的牌牌呈給他讓他自己翻去吧~
好啦,以上就是今天的知識總結,如果大家有什麼疑問或者發現文中有什麼描述不對的地方,歡迎大家留言評論,我們一起學習呀~~
Biu~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~pia!