Java虛擬機器學習
阿新 • • 發佈:2018-12-31
物件訪問會涉及到Java棧、Java堆、方法區這三個記憶體區域。
如下面這句程式碼:
[java] view plaincopyprint?- Object objectRef = new Object();
假設這句程式碼出現在方法體中,"Object objectRef” 這部分將會反映到Java棧的本地變數中,作為一個reference型別資料出現。而“new Object()”這部分將會反映到Java堆中,形成一塊儲存Object型別所有例項資料值的結構化記憶體,根據具體型別以及虛擬機器實現的物件記憶體佈局的不同,這塊記憶體的長度是不固定。另外,在java堆中還必須包括能查詢到此物件型別資料(如物件型別、父類、實現的介面、方法等)的地址資訊,這些資料型別儲存在方法區中。
reference型別在java虛擬機器規範裡面只規定了一個指向物件的引用地址,並沒有定義這個引用應該通過那種方式去定位,訪問到java堆中的物件位置,因此不同的虛擬機器實現的訪問方式可能不同,主流的方式有兩種:使用控制代碼和直接指標。
控制代碼訪問方式:java堆中將劃分出一塊記憶體來作為控制代碼池,reference中儲存的就是物件的控制代碼地址,而控制代碼中包含了物件例項資料和型別資料各自的具體地址資訊。
指標訪問方式:reference變數中直接儲存的就是物件的地址,而java堆物件一部分儲存了物件例項資料,另外一部分儲存了物件型別資料。
這兩種訪問物件的方式各有優勢,使用控制代碼訪問方式最大好處就是reference中儲存的是穩定的控制代碼地址,在物件移動時只需要改變控制代碼中的例項資料指標,而reference不需要改變。使用指標訪問方式最大好處就是速度快,它節省了一次指標定位的時間開銷,就虛擬機器而言,它使用的是第二種方式(直接指標訪問)。