前言
之前的系列文章中,已經寫過,我們的Java虛擬機棧中除了有局部變量表外,還有對象的引用reference。
那麼reference裏面是如何存放對象的地址的呢?
我們如何通過reference定位到對象呢?
目前比較主流的對象訪問方式有兩種:
- 直接指針
- 句柄訪問
一、句柄訪問
什麼句柄訪問呢?就是在Java堆中有一塊專門的內存空間用來存放句柄,叫做句柄池。
句柄中存放着:
- 對象在堆中的地址
- 對象所屬的類在方法區中的地址
二、直接指針
直接指針呢就是將對象所屬類型的信息放到了對象的對象頭MarkWord中。
那麼直接指針只存放指向對象實例在堆中的位置就可以了。
三、兩種方式對比
句柄呢,不管對象實例的地址如何變化,句柄的地址都是不變化的,穩定的,也就是reference本身是不變化的。
什麼時候對象地址會變化呢?當垃圾收集的時候,對象的地址變動是很正常的。
直接指針的方式,少了一次尋找對象所屬類的尋址訪問,效率會相對高一些。
對於我們使用的HotSpot虛擬機來說,使用的直接指針的方式來進行對象的訪問的。