java虛擬機器中指定一個棧記憶體的引用指向了堆記憶體中的物件。這樣說只是籠統的說法。而指向堆記憶體中的物件就一定是棧引用所需要的那個物件嗎?其實並不定。
這就需要知道物件的訪問定位方式有兩種:
1.使用控制代碼。所謂的控制代碼其實就是堆記憶體中分配一塊記憶體記錄物件例項的指標和物件型別資料的指標,而物件型別資料區域是在方法區中的。這樣棧引用第一步先指向堆中
的控制代碼。第二步根據控制代碼中的物件例項的指標和物件型別資料的指標找到對應的物件例項和其型別資料。雖然這裡用了兩步,必然對於使用直接指標來說,效率必然會慢。因為
這裡經過兩步才找到對應的物件例項和其型別資料。但是這樣的好處就是如果物件例項和其型別資料的指標變動很頻繁,變動的只是堆中的控制代碼,而棧的引用卻不用變動。
2.使用直接指標:直接指標就是,在棧引用中直接根據物件例項的指標和物件型別資料的指標找到對應的物件例項和其型別資料。只需要用一步就可以找到對應的物件例項和其型別資料。
對於很多物件的 訪問定位來說,減少了一次定址,這必然效率很高,效能很好。
HotSpot虛擬機器則是使用直接指標的方式對物件的訪問定位。