標籤:java對象 java對象訪問 對象的定位
java對象在訪問的時候,我們需要通過java虛擬機器棧的reference類型的資料去操作具體的對象。由於reference類型在java虛擬機器規範中只規定了一個對象的引用,並沒有定義這個這個引用應該通過那種方式去定位、訪問java堆中的具體對象執行個體,所以一般的訪問方式也是取決與java虛擬機器的類型。目前主流的訪問方式有通過控制代碼和直接指標兩種方式。
1.控制代碼訪問
使用控制代碼訪問方式,java堆將會劃分出來一部分記憶體去來作為控制代碼池,reference中儲存的就是對象的控制代碼地址。而控制代碼中則包含對象執行個體資料的地址和物件類型資料(如對象的類型,實現的介面、方法、父類、field等)的具體地址資訊。下邊我以一個例子來簡單的說明一下:
Object obj = new Object();
Object obj表示一個本地引用,儲存在java棧的本地便變數表中,表示一個reference類型的資料。
new Object()作為執行個體對象存放在java堆中,同時java堆中還儲存了Object類的資訊(物件類型、實現介面、方法等)的具體地址資訊,這些地址資訊所執行的資料類型儲存在方法區中。
2. 直接指標訪問
如果使用指標訪問,那麼java堆對象的布局中就必須考慮如何放置訪問類型的相關資訊(如對象的類型,實現的介面、方法、父類、field等),而reference中儲存的就是對象的地址。這兩種訪問方式各有利弊,使用控制代碼訪最大的好處是reference中儲存著穩定的控制代碼地址,當對象移動之後(垃圾收集時移動對象是非常普遍的行為),只需要改變控制代碼中的對象執行個體地址即可,reference不用修改。
使用指標訪問的好處是訪問速度快,它減少了一次指標定位的時間開銷,由於java是物件導向的語言,在開發中java對象的訪問非常的頻繁,因此這類開銷積少成多也是非常可觀的,反之則提升訪問速度。
本文參考《深入理解java虛擬機器 JVM進階特性與最佳實務》一書。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
java對象的訪問定位方式