天天看點

JVM中對象的通路定位方式(句柄、直接指針)

參考:深入了解Java虛拟機:JVM進階特性與最佳實踐(第3版) 周志明 著

建立對象是為了使用該對象,

Java

程式會通過棧上的

reference

資料來操作堆上的具體對象。由于

reference

類型在《

Java

虛拟機規範》裡面隻規定了它是一個指向對象的引用,并沒有定義這個引用應該通過什麼方式去定位、通路到堆中對象的具體位置,是以對象通路方式也是由虛拟機實作而定的,主流的通路方式主要有 使用句柄 和 直接指針 兩種。

1、通過句柄通路對象

JVM中對象的通路定位方式(句柄、直接指針)

Java

堆中将會劃分出一塊記憶體來作為 句柄池,

reference

中存儲的就是對象的句柄的位址,而句柄中包含了對象執行個體資料與類型資料各自具體的位址資訊。

優點:

reference

存儲的是穩定的句柄位址,在對象被移動(垃圾收集時移動對象是非常普遍的行為)時隻會改變句柄中的執行個體資料指針,而

reference

本身不需要改變。

缺點:增加了一次指針定位的時間開銷。

2、通過直接指針通路對象(HotSpot使用的方式)

JVM中對象的通路定位方式(句柄、直接指針)

reference

中存儲的直接就是對象位址,如果隻是通路對象本身的話,就不需要多一次間接通路的開銷。對象執行個體資料中有指向對象類型資料的指針。

優點:節省了一次指針定位的開銷。

缺點:在對象被移動時

reference

本身需要被修改。

繼續閱讀