Java陣列物件佔用多少個位元組?

哪時我還小發表於2020-12-15

 

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個位元組

然後分別看一下每個陣列例項資料佔用的空間大小

型別頭部佔用例項資料佔用空間詳情(位元組)補齊填充總佔用
byte163524
int1612432
long1624040
String1612432

 

對於上面的結果,我對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];

可以預測一下上面兩個物件佔用的空間大小.

實際結果: 兩個物件佔用空間大小是一樣的

 

 

 

相關文章