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