Java對象在JVM中的訪問方式

最使人疲憊的,往往不是道路的遙遠,而是你心中的鬱悶;最使人頹廢的,往往不是前途的坎坷,而是你自信的喪失。

Java對象在JVM中的訪問方式

加油

建立對象是為了使用對象,我們的Java程序需要通過棧上的reference數據來操作堆上的具體對象。由於reference類型在Java虛擬機規範中只規定了一個指向對象的引用,並沒有定義這個引用應該通過何種方式去定位、訪問堆中的對象的具體位置,所以對象訪問方式也是取決於虛擬機實現而定的。

目前主流的訪問方式有使用句柄訪問和直接指針訪問兩種。

  • 句柄訪問

如果使用句柄訪問的話,那麼Java堆中將會劃分出一塊內存來作為句柄池,reference中存儲的就是對象的句柄地址,而句柄中包含了對象實例數據與類型數據各自的具體地址信息。

使用句柄來訪問的最大好處就是reference中存儲的是穩定的句柄地址,在對象被移動(垃圾收集時移動對象是非常普遍的行為)時只會改變句柄中的實例數據指針,而reference本身不需要修改。

  • 直接指針訪問

如果使用直接指針訪問,那麼Java堆對象的佈局中就必須考慮如何放置訪問類型數據的相關信息,而reference中存儲的直接就是對象地址。

使用直接指針訪問方式的最大好處就是速度更快,它節省了一次指針定位的時間開銷,由於對象的訪問在Java堆中非常頻繁,因此這類開銷積少成多後也是一項非常可觀的執行成本。HotSpot虛擬機就是採用直接指針訪問的方式進行對象訪問的。

擴展閱讀:

Java JVM運行時數據區域

Java JVM中對象是怎麼創建的

Java JVM對象的內存佈局


分享到:


相關文章: