Java對象的內存結構分佈簡介

概念

在JVM虛擬機種Java對象的內存結構如圖所示分爲三大塊:對象頭(Header)、對象種的實際數據(Instance Data)、對齊填充(Padding)。
在這裏插入圖片描述

對象頭(Header)

  1. Mark Word:用於存儲對象自身的運行時數據,如哈希碼(HashCode)、GC 分代年齡、鎖狀態標誌、線程持有的鎖、偏向線程 ID等。Mark Word 被設計成一個非固定的數據結構以便在極小的空間內存儲儘量多的信息,它會根據自己的狀態複用自己的存儲空間。
  2. Class Pointer:對象指向它的類數據的指針,虛擬機通過這個指針來確定這個對象是哪個類的實例;
  3. Length:如果對象是一個 Java 數組,那在對象頭中還必須有一塊用於記錄數組長度的數據。因爲虛擬機可以通過普通 Java 對象的元數據信息確定 Java 對象的大小,但是從數組的元數據中無法確定數組的大小。

在32 位JVM中,存放 Class 指針的空間大小是 4 字節,Mark Word 空間大小也是4字節,因此頭部就是 8 字節,如果是數組就需要再加 4 字節表示數組的長度,如下表所示:
在這裏插入圖片描述

在 64 位 JVM 中,開啓指針壓縮,頭部存放 Class 指針的空間大小還是4字節,而 Mark Word 區域會變大,變成 8 字節,也就是頭部最少爲 12 字節,如下圖所示:
在這裏插入圖片描述

對象實際數據(Instance Data)

實例數據部分是對象真正存儲的有效信息,也是在程序代碼中所定義的各種類型的字段內容。例如:byte和boolean是1個字節,short和char是2個字節,int和float是4個字節,long和double是8個字節,reference是4個字節(64位系統中是8個字節)。

對齊填充

對齊填充不是必然存在的,沒有特別的含義,它僅起到佔位符的作用。由於 HotSpot VM 的自動內存管理系統要求對象起始地址必須是 8 字節的整數倍,也就是說對象的大小必須是 8 字節的整數倍。對象頭部分是 8 字節的倍數,所以當對象實例數據部分沒有對齊時,就需要通過對齊填充來補全。

總結

對象的數據結構如下圖所示:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章