JAVA對象頭


#為了防止自己忘記,先記着,之前我一直以為《深入理解JAVA虛擬機》寫錯了來着。

一. JAVA對象

在HotSpot虛擬機中,對象在內存中存儲的布局可以分為3塊區域:對象頭(Header),實例數據(Instance Data)和對齊填充(Padding)。

也就是說  JAVA對象 = 對象頭 + 實例數據 + 對象填充

 二. 對象頭

對象頭由兩部分組成,一部分用於存儲自身的運行時數據,稱之為 Mark Word,另外一部分是類型指針,及對象指向它的類元數據的指針。

對象頭 = Mark Word + 類型指針

(未開啟指針壓縮的情況下)

在32位系統中,Mark Word = 4 bytes = 32 bits,對象頭 = 8 bytes = 64 bits;

在64位系統中,Mark Word = 8 bytes = 64 bits ,對象頭 = 16 bytes = 128bits;

三. 實例數據

http://www.cnblogs.com/magialmoon/p/3757767.html  引用這位大手子的文章

原生類型(primitive type)的內存占用如下:

Primitive Type Memory Required(bytes)
boolean                       1
byte                             1
short                            2
char                             2
int                                4
float                             4
long                             8
double     8

reference類型在32位系統上每個占用4bytes, 在64位系統上每個占用8bytes。

四. 對齊填充

對齊填充並不是必然存在的,也沒有什么特別的意義,他僅僅起着占位符的作用,由於HotSpot VM的自動內存管理系統要求對象起始地址必須是8字節的整數倍,換句話說,就是對象的大小必須是8字節的整數倍。而對象頭正好是8字節的倍數,因此,當對象實例數據部分沒有對齊時,就需要通過對齊填充來補全。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM