使用Java開發的人都清楚在Java中對象引用做用相似C++中指針,經過對象引用定位對象,可是具體在JVM中又是採用什麼方式去定位堆中對象的具體位置,大部分人都不太瞭解,這裏咱們講述下不一樣Java虛擬機主要使用的兩種對象訪問方式,句柄訪問和直接指針訪問。spa
圖1-1指針
虛擬機若是使用句柄訪問方式,Java堆中首先會劃分出一塊內存做爲句柄池,這時候對象引用reference存儲的就是對象的句柄地址而不是做爲對象指針指向堆中對象的地址,而句柄池中的對象實例包含指向對象實例數據和類型數據的指針,採用句柄訪問方式要得到完整的對象信息須要進行三次指針定位。對象
直接指針訪問對象,Java虛擬機須要在堆中爲對象分配額外的空間存儲指向方法區對象類型數據的指針,採用直接指針訪問方式,對象引用直接存儲堆中對象的地址,只須要進行兩次指針定位。目前hot spot就是採用這種對象訪問方式。blog
兩種方式各有優劣,使用句柄訪問的好處是在每次對象位置發生變更時只須要改變句柄中指向實例數據的指針,而指向對象類型數據的指針和對象引用指針reference都不須要修改,而使用直接指針訪問,當對象發生移動時對象引用reference須要修改。可是使用直接指針訪問方式少了一次指針定位的時間開銷速度更快。內存