1. 程式人生 > >jvm 物件的訪問定位,即引用是怎麼定位到記憶體中的物件的

jvm 物件的訪問定位,即引用是怎麼定位到記憶體中的物件的

物件的訪問定位有兩種方式:

第一種,引用使用控制代碼訪問物件:

概念:引用儲存的是一個地址,該地址是控制代碼的地址,而控制代碼是一種結構,分別儲存 例項指標和型別指標 這兩種指標,(例項指標是指向堆中的物件例項,而型別指標指向的是在方法區中該物件所屬型別)。當要訪問物件時,先通過引用訪問控制代碼,再通過控制代碼訪問物件例項以及物件型別資訊。控制代碼是儲存在堆中的,如果使用這種方式,那麼就會從堆中分出一塊記憶體用作控制代碼池。

優點:物件經過多次移動時,虛擬機器只需要修改控制代碼中的指向物件例項的指標即可,不用修改引用。垃圾收集器移動物件還是挺頻繁了,比如新生代中的從Eden區或者Survivor From區移到Survivor To區,再比如  新生代Survivor To區的物件移到老年代中等等,都是在移動物件在堆中的位置。

缺點:其實上面講過了,通過控制代碼這種方式,引用訪問物件需要先訪問控制代碼,在通過控制代碼訪問例項,需要兩個步驟,而下面講的直接指標訪問只需要一個步驟即可,在一個系統中,這多一個步驟所累積起來消耗的效能也是很客觀的。畢竟訪問物件是一種很頻繁的行為。

第二種,引用使用直接指標訪問物件:

概念:引用儲存的是物件例項在堆中的地址,通過引用可以直接訪問物件例項,只需要經過一個步驟。這個時候只需要考慮該物件型別指標存在哪,一般物件型別指標是放在物件例項中,這樣的話,只有訪問物件型別資訊需要經過兩個步驟,並且這個行為相對於訪問物件例項就不是那麼頻繁了。

優點:直接指標訪問物件的優點其實就是第一種 控制代碼訪問的缺點,這邊不再贅述。

缺點:這個的缺點就是第一種訪問方式的優點,垃圾收集器移動物件時需要修改引用。。。不過,垃圾收集器移動物件一般沒有比訪問物件更頻繁,所以使用這種方式一半比第一種方式合算,除非垃圾收集器移動物件的行為非常頻繁。

總結

在HotSpot中,使用的是第二種方式,我們常用的jvm也是HotSpot