Java陣列物件佔用多少個位元組?
阿新 • • 發佈:2020-12-17
技術標籤:java
Java記憶體模型基礎知識
物件記憶體中可以分為三塊區域:
-
物件頭(Header)
-
MarkWord佔用8位元組
-
Class Point佔用4位元組
-
Length 陣列佔用4位元組
-
-
例項資料(Instance Data)
-
對齊填充(Padding)
眾所周知Object object = new Object()佔用了16位元組,然後看一下下面幾個陣列佔用空間大小
int[] intArr = new IntArr[3];
String[] stringArr = new String[3];
byte[] byteArr = new byte[3];
long[] longArr = new long[3];
對於上面幾個陣列來說,Mark Word, Class Point,Length佔用的空間都是一樣的(16),只有例項資料佔用空間不相等,那麼先看一下相同部分空間佔用情況,
Mark Word佔用8個位元組
Class Point 佔用4個位元組
Length 佔用4個位元組
然後分別看一下每個陣列例項資料佔用的空間大小
型別 | 頭部佔用 | 例項資料佔用空間詳情(位元組) | 補齊填充 | 總佔用 |
---|---|---|---|---|
byte | 16 | 3 | 5 | 24 |
int | 16 | 12 | 4 | 32 |
long | 16 | 24 | 0 | 40 |
String | 16 | 12 | 4 | 32 |
對於上面的結果,我對byte,int,long的佔用完全理解,因為例項資料佔用 = 陣列長度 * 型別佔用位元組數,但是對於String型別不甚理解,然後各種百度,最後終於榆木腦袋開了竅,對於String陣列來說,每個元素就是存的一個物件的引用地址,而每個引用地址佔4個位元組,所以例項資料佔用 = 陣列長度 * 引用地址佔用位元組數
在看下面兩個例子:
分別建立兩個物件
物件1
public class Obj1 {
private char[] value;
private int count;
private int offset;
private int hashcode;
}
物件2
public class Obj2 {
String value;
}
Obj1[] arr1 = new Obj1[3];
Obj2[] arr2= new Obj2[3];
可以預測一下上面兩個物件佔用的空間大小.
實際結果: 兩個物件佔用空間大小是一樣的