1. 程式人生 > >Java物件的記憶體佈局以及物件所需記憶體大小計算詳解

Java物件的記憶體佈局以及物件所需記憶體大小計算詳解

1. 記憶體佈局

在HotSpot虛擬機器中,物件的記憶體佈局可以分為三部分:物件頭(Header)、 例項資料(Instance Data)和對齊填充(Padding)。

這裡寫圖片描述

1) 物件頭(Header):

物件頭又可以分為兩部分:
第一部分用來儲存物件自身的執行時基本資料資訊。如雜湊碼、GC分代年齡、鎖狀態標示、執行緒持有的鎖等。這部分資料的長度在32bit和64bit虛擬機器上分別為32bit和64bit。官方稱呼是“Mark Word”。
第二部分是型別指標,或者說指向類的元資料資訊的引用。虛擬機器通過這個指標(引用)來確定這個物件是哪個類的例項。我的理解是:這個引用指向了該物件對應的Class物件。 如果一個類被載入了,就會在方法區生成一個代表該類的Class物件(唯一一種不在堆上生成的物件例項)該物件將作為程式訪問方法區中該類的資訊的外部介面。有了該物件的存在,才有了反射的實現。另外,如果物件是一個Java陣列,物件頭中還要有一塊記錄陣列長度的資料。

2) 例項資料(Instance Data):

例項資料部分是物件真正儲存的有效資訊,也是在程式程式碼中定義的各種型別的欄位內容。無論是父類繼承下來的,還是本類中定義的,都需要記錄起來。HotSpot虛擬機器預設的分配策略為longs/doubles、ints、shorts/chars、bytes/booleans、oops(Ordinary Object Pointers),相同寬度的欄位總是被分配到一起。

3) 對齊填充(Padding):

對齊填充不是必要的,由於HotSpot虛擬機器要求物件起始地址必須是8位元組的整數倍,所以物件的大小必須是8位元組的整數倍。所以就有了對齊填充。

2. 物件所需記憶體大小計算