1. 程式人生 > >深入理解JVM之物件訪問定位

深入理解JVM之物件訪問定位

當我們建立完成物件之後要使用物件,那麼我們如何找到這個物件呢?這就用到本文所講述的物件訪問定位。

建立物件是為了使用資料,我們的Java程式需要通過棧上的reference資料來操作堆上的具體物件。由於reference型別在Java虛擬機器規範中只規定了一個指向物件的引用,並沒有定義這哥引用應該通過何種方式去定位,訪問堆中的物件的具體位置,所以物件訪問方式也是取決於虛擬機器的實現而定的。目前流行的有兩種方式。

物件訪問定位

  • 使用控制代碼
  • 直接指標

控制代碼訪問

如果使用控制代碼訪問的話,那麼Java堆將會劃分出一塊記憶體來作為控制代碼池,reference中儲存的就是物件的控制代碼地址,而控制代碼中包含了物件的例項資料與型別資料各自的具體地址資訊。

直接指標

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

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

使用直接指標訪問方式的好處就速度更快,節省了一次指標定位的時間開銷,由於物件的訪問在Java中非常頻繁,因此這類開銷積少成多後也是一項非常可觀的執行成本,比如HotSpot虛擬機器就是使用這種方式進行物件訪問的,但從整個軟體開發範圍看,各種語言和框架使用控制代碼來訪問物件的情況也是非常常見的。