Java对象的内存结构
HotSpot虛擬機(jī)中,對象在內(nèi)存中存儲的布局可以分為三塊區(qū)域:
- 對象頭(Header)
- 示例數(shù)據(jù)(Instance Data)
- 對其填充(Padding)
Mark Word(標(biāo)記字段)
其內(nèi)容是一系列的標(biāo)記位,用于儲存對象自身運(yùn)行時的數(shù)據(jù),如HashCode、GC分代年齡、鎖狀態(tài)標(biāo)志、線程持有鎖、偏向線程ID、偏向時間戳等
占用內(nèi)存為一個機(jī)器碼,32為系統(tǒng)占用4個字節(jié),64位系統(tǒng)位8個字節(jié)。
以32位系統(tǒng)為例:在無鎖狀態(tài)下包含,25Bit對象的hashcode、4bit 對象的分代年齡、1bit 是否是偏向鎖、2bit 鎖標(biāo)志位
考慮到虛擬機(jī)的空間效率,Mark Word被設(shè)計成一個非固定的數(shù)據(jù)結(jié)構(gòu)以便于在極小空間內(nèi)存存儲盡量多的數(shù)據(jù),他會根據(jù)對象的狀態(tài)復(fù)用自己儲存空間,也就是說,Mark Word會隨著程序的運(yùn)行發(fā)生變化。
Klass Pointer(類型指針)
類型指針指向?qū)ο蟮念愒獢?shù)據(jù)的內(nèi)存地址、虛擬機(jī)通過這和指針確定該對象是哪個類的實例占用內(nèi)存為一個機(jī)器碼,32位系統(tǒng)一個機(jī)器碼為4個字節(jié),64位系統(tǒng)一個機(jī)器碼為 8字節(jié)一個對象頭一般占用兩個機(jī)器碼,但是數(shù)組稍微特殊,使用三個機(jī)器碼,其中一個機(jī)器碼用來存放數(shù)組長度。
對象的實例數(shù)據(jù)
這里面包含了對象的所有成員變量,其大小由各個成員變量的大小決定,比如:
- byte和boolean是一個字節(jié)
- short和char是2個字節(jié)
- int 和 float 是4個字節(jié)
- long和double是8個字節(jié)
- 引用類型在32位系統(tǒng)上每個占用4字節(jié),在64位系統(tǒng)上每個占8字節(jié)
對齊填充
HotSpot VM 的自動內(nèi)存管理系統(tǒng)要求對象起始地址必須是8字節(jié)的整數(shù)倍。
在64位系統(tǒng)下:
- new int[0]:對象頭(8 + 24字節(jié))+實例數(shù)據(jù)(0字節(jié))+對齊填充(0字節(jié))= 32 字節(jié);
- new int[1]:對象頭(8 + 24字節(jié))+ 實例數(shù)據(jù) (基本類型 4 字節(jié)) + 對齊填充 (4字節(jié)) =40字節(jié)
- integer a :對象頭(8+ 16字節(jié))+ 示例數(shù)據(jù) (引用類型 8 字節(jié)) + 對齊填充 (0字節(jié)) = 32字節(jié)
對象頭中:
標(biāo)記字段位8字節(jié)
然后是類型指針字段 數(shù)組占用三個機(jī)器碼 24 其他占用兩個子起碼位16字節(jié)
總結(jié)
以上是生活随笔為你收集整理的Java对象的内存结构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中山大学软件工程c语言,2018中山大学
- 下一篇: 抛硬币仿真实验java_探索HyperL