2017-04-11 10 views
0
Class Abc { 
    Integer a; 
    Integer b; 
    Integer c; 
    getters(); 
    setters(); 
} 

分配給對象(PO​​JO)當我創建對象Abc abc = new Abc()即12字節(4字節爲整數)是否被存儲或分配時我設置一些值的變量等setA(10).什麼時候存儲器獲取的Java

+0

假設你的意思是堆內存而不是堆棧:對於這個類,當你調用'new'時(Java引用是衆所周知的,通常需要8個字節,並且你有三個字節),然後得到3x8 = 24字節,然後當您創建每個「Integer」時,至少需要另外4個字節。另外,當類文件被加載時(不知道有多少字節,請查看類文件),「Class」本身就有一次分配。 – markspace

+0

對象初始化時分配內存(即'new Object()')。然而,一個'int'每個需要4個字節,而且你正在使用'Integer'包裝(盒裝)類,這將需要更多的內存。 –

+1

當你調用'new'時分配內存。 –

回答

1

當我創建對象Abc abc = new Abc(),即12字節(整型爲4字節)時,是否分配內存。

是的。更具體地說,它在調用Abc類的構造函數鏈之前立即被分配。

但是,分配的空間還包含一些頭信息,您的示例中的金額取決於JVM是使用32位還是64位地址進行引用。 (Integer類型是一個引用類型!)

(假設32位引用,大小可能是3 x 4字節+ 8字節頭+ 4字節填充;即24字節,但這是JVM實現特定的。)


或者當我設置一些值像setA(10)的變量。

這將取決於setA方法的簽名以及實施方式。問題在於是否存在int - >Integer的自動裝箱以及發生何種情況/何時發生。

但是在所有情況下,(可能)分配的Integer對象不是Abc對象的一部分。 Abc對象具有用於保存對象Integer的引用的字段,這些字段的空間是對象Abc的一部分...這意味着它在分配對象時分配,而不是在設置字段時分配。

+0

有多少內存分配給'Map map = new HashMap ();'? – Gajendra24

+0

您可以隨時查看源代碼並自行解決。 –

相關問題