Java中一個對象所佔用的字節數爲8的整數倍。
Java對象包含四個部分:
A:對象頭,佔用很少的字節,表述Object當前狀態的信息
B:基本類型域佔用的空間(原生域指 int、boolean、short等)
C:引用類型域佔用的空間(引用類型域指 其他對象的引用,每個引用佔用4個字節)
D:填充物佔用的空間(後面說明什麼是填充物)
A.對象頭:包含一個對象的元數據信息,描述這個對象的狀態,ID,實例名字,數組長度等。。
內存中,每個對象佔用的總空間不僅包含對象內聲明的變量所需要的空間,還包括一些額外信息,比如:對象頭 和 填充物。“對象頭”的作用是用來記錄一個對象的實例名字、ID 和 實例狀態(例如,當前實例是否“可到達”,或者當前鎖的狀態等等)。
在當前的JVM版本中(Hotspot),“對象頭”佔用的字節數如下:
一個普通對象,佔用8 bytes
數組,佔用 12 bytes,包含普通對象的 8 bytes + 4 bytes(數組長度)
B:基本類型:包含這個對象的基本類型數據空間
boolean、byte 佔用 1 byte,char、short 佔用 2 bytes,int、float 佔用 4 bytes,long、double 佔用 8 bytes
C:引用類型:包含一些引用類型或方法所佔用的空間
每個引用類型佔用 4 bytes
D:填充物:由於對象所佔用的數據大小爲8的整數倍,有時前三者佔用空間大小總和不是8整數倍,需要填充幾個字節使其爲8的整數倍。
在Hotspot中,每個對象佔用的總空間是以8的倍數計算的,對象佔用總空間(對象頭+聲明變量)不足8的倍數時候,自動補齊。而,這些被填充的空間,我們可以稱它爲“填充物”。