Java中的物件訪問,一般會涉及到Java棧、Java堆、方法區這三個記憶體區域。
比如下面這句程式碼:
Object objectRef = new Object();
假設這句程式碼出現在方法體中,"Object objectRef” 這部分將會反映到Java棧的本地變數中,作為一個reference型別資料出現。而“new Object()”這部分將會反映到Java堆中,形成一塊儲存Object型別所有例項資料值的結構化記憶體,根據具體型別以及虛擬機器實現的物件記憶體佈局的不同,這塊記憶體的長度是不固定。另外,在java堆中還必須包括能查詢到此物件型別資料(如物件型別、父類、實現的介面、方法等)的地址資訊,這些資料型別儲存在方法區中。
reference型別在java虛擬機器規範裡面只規定了一個指向物件的引用地址,並沒有定義這個引用應該通過那種方式去定位,訪問到java堆中的物件位置,因此不同的虛擬機器實現的訪問方式可能不同,主流的方式有兩種:使用控制代碼和直接指標。
控制代碼訪問方式:java堆中將劃分出一塊記憶體來作為控制代碼池,reference中儲存的就是物件的控制代碼地址,而控制代碼中包含了物件例項資料和型別資料各自的具體地址資訊。
指標訪問方式:reference變數中直接儲存的就是物件的地址,而java堆物件一部分儲存了物件例項資料,另外一部分儲存了物件型別資料。