對象的訪問定位 - 句柄、指針

創建對象是爲了使用對象,咱們的Java程序須要經過棧上的reference數據來操做堆上的具體對象。因爲reference 類型在Java虛擬機規範中只規定了一個指向對象的引用,並無定義這個引用應該經過何種方式去定位、訪問堆中的對象的具體位置,因此對象訪問方式也是取決於虛擬機實現而定的。目前主流的訪問方式有使用句柄和直接指針兩種。
1、句柄訪問方式:
若是使用句柄訪問的話,那麼Java 堆中將會劃分出一塊內存來做爲句柄池,reference中存儲的就是對象的句柄地址,而句柄中包含了對象實例數據與類型數據(類信息,方法類型信息)各自的具體地址信息,以下圖所示。

句柄方式訪問 
2、指針訪問方式: 
若是使用直接指針訪問,那麼Java堆對象的佈局中就必須考慮如何放置訪問類型數據的相關信息,而reference 中存儲的直接就是對象地址,以下圖所示。
指針訪問方式 java

這兩種對象訪問方式各有優點: 
使用句柄來訪問的最大的好處就是reference中存儲的是穩定的句柄地址,在對象被移動(垃圾收集時移動對象是很是廣泛的行爲) 時只會改變句柄中的實例數據指針,而reference 自己不須要修改。
使用直接指針訪問方式的最大好處就是速度更快,它節省了一次指針定位的時間開銷,因爲對象的訪問在Java中很是頻繁,所以這類開銷聚沙成塔後也是一項很是可觀的執行成本。
對於Oracle的HotSpot虛擬機而言,它是使用第二種方式進行對象訪問的,但從整個軟件開發的範圍來看,各類語言和框架使用句柄來訪問的狀況也十分常見。框架

 取自《深刻理解java虛擬機第二版》2.3.3 對象的訪問定位佈局

相關文章
相關標籤/搜索