Java程序經過棧上的reference數據來操做堆上的具體對象。框架
若是使用句柄訪問的話,佈局
- Java堆中將會劃分出一塊內存來做爲句柄池,
- reference中存儲的就是對象的句柄地址,
- 而句柄中包含了對象實例數據與類型數據的具體各自的地址信息。
- 以下圖:
若是使用直接指針訪問的話,指針
- Java堆對象的佈局中就必須考慮如何放置訪問類型數據的相關信息,
- reference中存儲的直接就是對象地址,
- 以下圖:
兩者對比對象
- 使用句柄來訪問的最大好處就是reference中存儲的是穩定句柄地址,
- 在對象被移動(垃圾收集時移動對象是很是廣泛的行爲)時只會改變句柄中的實例數據指針,
- 而reference自己不須要被修改。
- 使用直接指針來訪問最大的好處就是速度更快,
- 它節省了一次指針定位的時間開銷,
- 因爲對象訪問的在Java中很是頻繁,
- 所以這類開銷積小成多也是一項很是可觀的執行成本。
就HotSpot而言,他使用的是直接指針訪問方式進行對象訪問,但從整個軟件開發的範圍來看,各類語言和框架使用句柄來訪問的狀況也十分常見。blog