JVM中如何訪問到對象 — JVM系列(四)

前言

之前的系列文章中,已經寫過,我們的Java虛擬機棧中除了有局部變量表外,還有對象的引用reference。

那麼reference裏面是如何存放對象的地址的呢?

我們如何通過reference定位到對象呢?

目前比較主流的對象訪問方式有兩種:

  1. 直接指針
  2. 句柄訪問

一、句柄訪問

什麼句柄訪問呢?就是在Java堆中有一塊專門的內存空間用來存放句柄,叫做句柄池。

句柄中存放着:

  • 對象在堆中的地址
  • 對象所屬的類在方法區中的地址

二、直接指針

直接指針呢就是將對象所屬類型的信息放到了對象的對象頭MarkWord中。

那麼直接指針只存放指向對象實例在堆中的位置就可以了。

三、兩種方式對比

句柄呢,不管對象實例的地址如何變化,句柄的地址都是不變化的,穩定的,也就是reference本身是不變化的。

什麼時候對象地址會變化呢?當垃圾收集的時候,對象的地址變動是很正常的。

直接指針的方式,少了一次尋找對象所屬類的尋址訪問,效率會相對高一些

對於我們使用的HotSpot虛擬機來說,使用的直接指針的方式來進行對象的訪問的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章