標籤:資料操作 head div tar 補全 技術 使用 對象 如何
先來看看Java對象在記憶體中的布局
一 Java對象的記憶體布局在HotSpot虛擬機器中,對象在記憶體中的布局分為3個地區
- 對象頭(Header)
- Mark Word(在32bit和64bit虛擬機器上長度分別為32bit和64bit)儲存物件自身的運行時資料,包括雜湊碼,GC分代年齡,鎖狀態標誌,線程持有的鎖,偏向線程ID,偏向時 間戳等
- 類型指標 即對象指向它的類別中繼資料的指標,虛擬機器通過這個指標來確定這個對象是哪個類的執行個體.但是並不是所有類型虛擬機器實現都必須在對象資料上保留類型指標,如果對象是一個java數組,那在對象頭中還必須有一塊用於記錄數組長度的資料,因為虛擬機器可以通過普通java對象的中繼資料資訊確定Java對象的大小,但是從數組的中繼資料中卻無法確定資料的大小
- 執行個體資料(Instance Data)
- 對象真正儲存資訊的地方,也是代碼中所定義的各種類型的欄位內容.無論是繼承下來的,還是子類中定義的,都需要記錄起來.
- 對象填充(Padding)
- 並不是必然存在的,也沒有特別的含義僅僅起到點位符的作用.由於HotSpot的自動管理記憶體系統要求對象起始地址是8位元組的整數倍,換句話說就是對象的大小必須是8位元組的整數倍,而對象頭正好是8位元組的倍數(1倍或者2倍),因此當對象執行個體部分沒有對齊時,就需要通過對齊填充來補全
知道了Java對象的記憶體布局,那麼如何定位到對象呢?
二 Java對象的訪問定位
對立對象是為了使用對象.Java程式需要通過在棧上的reference資料操作堆上的具體對象. 由於reference類型在Java虛擬機器規範中只規定了一個指向對象的引用,並沒有定義這個引用應該通過何種方式去定位,訪問堆中的對象的具體位置,所以對象的訪問方式取決於虛擬機器的實現而定的.目前主流的訪問對象的方式有兩種
- 控制代碼
定義: Java堆中將會劃分出一塊記憶體來作為控制代碼池,refenerce中儲存的就是對象的控制代碼的地址,而控制代碼中包 含了對象執行個體資料與類型資料各自的具體地址資訊優點 : 最大的好處就是reference中儲存的是穩定的控制代碼的地址,在對象被移動(記憶體回收時移動對象是很常見的行為)時只會改變控制代碼中的執行個體資料的地址,而reference本身不需要修改
- 直接指標
定義 : reference中儲存直接對象的地址,但是必須考慮放置訪問類型資料的相關資訊優點 : 訪問速度快,節省了一次指標定位的時間開銷 注:HotSpot使用第2種方法,但是使用控制代碼的方法也很常見 這兩種對象訪問用兩張圖表示如下:
第一種: 使用控制代碼方式:
第二種:直接指標方式: 以上兩張圖明確的表示出控制代碼和指標兩種方法.
Java對象的記憶體布局以及對象的訪問定位