虛擬機器物件探索
1.物件的記憶體佈局
在HotSpot虛擬機器裡,物件在堆記憶體中的儲存佈局可以劃分為三個部分:物件頭、例項資料、對齊填充。
虛擬機器中物件的物件頭包括倆類資訊:
- 用於儲存物件自身的執行時資料,如雜湊嗎、GC分代年齡、鎖狀態標誌、執行緒持有的鎖、偏向執行緒ID、偏向時間戳等,在32位和64位的虛擬機器中分別為32和64個位元,官方稱為“Mark Word”。
考慮到虛擬機器的空間效率,Mark Word被設計成一個有著動態定義的資料結構,根據物件的複用自己的儲存空間。 - 型別指標,即物件指向它的型別後設資料的指標,Java虛擬機器通過這個指標來確定該物件是那個類的例項。不是所有的虛擬機器實現都需要在物件資料上儲存型別指標,如使用控制程式碼訪問。
例項資料是物件真正儲存的有效資訊,即在程式程式碼裡面所定義的各種型別的欄位內容。
物件的第三部分是對齊填充,不是必然存在,僅起著佔位符的作用。由於虛擬機器的自動記憶體管理系統要求物件起始地址必須是8位元組的整數倍,任何物件大小都必須是8位元組的整數倍。物件頭部分已經被設計為8位元組的倍數,因此對齊填充是否存在由例項資料大小決定。
2.物件的訪問定位
Java程式會通過棧上的reference資料來操作堆上的具體物件。reference型別在《Java虛擬機器規範》規定它是一個指向物件的引用,沒有規範具體,所以物件訪問方式有虛擬機器實現,主流方式有使用控制程式碼和直接指標兩種:
- 使用控制程式碼訪問的話,Java堆中將可能會劃分一塊記憶體來作為控制程式碼池,reference中儲存的就是物件的控制程式碼地址,控制程式碼地址中包含了物件例項資料與型別資料各自具體的地址資訊。
- 如果使用直接指標訪問,Java堆中物件的記憶體佈局必須考慮如何放置訪問型別資料的相關資訊,reference中儲存的是物件地址。
兩種方式各有優勢,使用控制程式碼來訪問的話最大好處就是reference中儲存穩定控制程式碼地址,在物件被移動時只會改變控制程式碼中的例項資料指標,而本身不需要被修改。
使用直接指標來訪問最大的好處就是速度快,節省了一次指標定位的時間開銷,對HotSpot而言,主要使用第二種方式進行物件訪問。
通過控制程式碼訪問物件
通過直接指標訪問物件
相關文章
- 詳解Java 虛擬機器(第②篇)——HotSpot 虛擬機器物件Java虛擬機HotSpot物件
- Dalvik虛擬機器、Java虛擬機器與ART虛擬機器虛擬機Java
- java虛擬機器和Dalvik虛擬機器Java虛擬機
- Android 虛擬機器 Vs Java 虛擬機器Android虛擬機Java
- 虛擬機器虛擬機
- Java虛擬機器05——物件分配與回收策略Java虛擬機物件
- 連線虛擬機器oracle 和虛擬機器KEY虛擬機Oracle
- 虛擬機器(三)虛擬機器配置靜態Ip虛擬機
- [深入理解Java虛擬機器]第二章 HotSpot虛擬機器物件探祕Java虛擬機HotSpot物件
- JVM(四)-虛擬機器物件JVM虛擬機物件
- PD虛擬機器 18 for Mac(Mac虛擬機器軟體)虛擬機Mac
- JVM 虛擬機器JVM虛擬機
- JVM虛擬機器JVM虛擬機
- Neo 虛擬機器虛擬機
- VMware虛擬機器虛擬機
- 虛擬機器arm虛擬環境搭建虛擬機
- VMware虛擬機器如何設定使主機和虛擬機器不同IP虛擬機
- 深入理解虛擬機器之虛擬機器類載入機制虛擬機
- 虛擬機器突然沒網了,虛擬機器突然滑鼠失靈虛擬機
- vmware克隆虛擬機器centos6.5,虛擬機器從新配置虛擬機CentOS
- 從ubuntu虛擬機器外部訪問虛擬機器內部資訊Ubuntu虛擬機
- 【虛擬機器】Windows(x86)上部署ARM虛擬機器(Ubuntu)虛擬機WindowsUbuntu
- xen安裝半虛擬化虛擬機器虛擬機
- 虛擬機器可以ping同宿主機,宿主機ping不通虛擬機器虛擬機
- JVM 虛擬機器 GCJVM虛擬機GC
- Java虛擬機器(JVM)Java虛擬機JVM
- 虛擬機器的概念虛擬機
- Python 虛擬機器Python虛擬機
- mac 裝虛擬機器Mac虛擬機
- 虛擬機器的克隆虛擬機
- kvm虛擬機器快照虛擬機
- 求助,虛擬機器崩了。。虛擬機
- Java虛擬機器(轉)Java虛擬機
- 安裝虛擬機器虛擬機
- 虛擬機器的搭建虛擬機
- xshell能ping通虛擬機器,不能連線虛擬機器虛擬機
- 虛擬機器軟體Parallels Desktop 19 for Mac虛擬機器 19.0.0虛擬機ParallelMac
- VMware虛擬機器優化,提高虛擬機器執行速度的方法?虛擬機優化