2011-12-09 98 views
3

我聲明一個字符串數組爲:字符串[]內存使用

String[] items1 = new String[5]; 
String[] items2 = new String[20]; 

多少效果這兩個陣列的將產生對存儲器和性能如果兩個僅包含2個元素。

回答

3

您可以測試這個自己。

public static void main(String... args) { 
    long free1 = free(); 
    String[] two = new String[2]; 
    long free2 = free(); 
    String[] twenty = new String[20]; 
    long free3 = free(); 
    if (free3 == free1) System.err.println("You need to use -XX:-UseTLAB"); 
    System.out.println("String[2] took " + (free1 - free2) + " bytes and String[20] took " + (free2 - free3) + " bytes."); 
} 

private static long free() { 
    return Runtime.getRuntime().freeMemory(); 
} 

打印

String[2] took 24 bytes and String[20] took 96 bytes. 

所以你可能會浪費72個字節的內存。如果你的內存每GB成本爲10美元,那麼你可能會浪費0.000072美分的內存。然而,你的第二個時間可能值2美分。在這種情況下,在這種情況下,毫不誇張地說,花費毫秒的時間來擔心它。即寫20而不是2所花費的時間是值得的,遠遠更多。

0

這取決於這2個元素的大小。

+0

我認爲OP意味着兩個陣列中相同的兩個元素。 – Averroes

+0

我想強調,如果一個人不注重細節,這些事情會變得多麼棘手。 –

0

兩者都只包含對字符串的引用,因此由String [5]使用的帶有兩個元素的內存等於String [5]帶有0個元素的內存。 String [20]也是如此。

現在由元素使用的內存是不同的故事。

2

與新的關鍵詞一起使用,您將與其大小關聯的數組定義到內存中,因此它取決於您是將值存儲在全部或部分內存中。如果你需要動態,那麼首選使用列表對象作爲動態數組是預先定義的類型,所以之後它不會減少或增加它的大小,因爲你必須創建新的數組對象,它的新大小

2

效果將會忽略不計,因爲您所做的只是分別存儲額外的3和18空引用。存儲額外的空引用不會顯着增加內存佔用量,也不會顯着影響代碼的性能。

但是,如果事先知道,要存儲多少個元素,似乎不需要5個或20個元素數組。

0
Consumed_HEAP(items1) = (POINTER_SIZE*5) + Consumed_HEAP(items1[0])+Consumed_HEAP(items1[1]) + ARRAY_METADATA 
Consumed_HEAP(items2) = (POINTER_SIZE*20) + Consumed_HEAP(items2[0])+Consumed_HEAP(items2[1]) + ARRAY_METADATA 
POINTER_SIZE = x86 ? 4 : x64 ? 8 : ... 
Consumed_HEAP(str) = str.length() * 2 + SOME_JVM_SPECIFIC_HEAP_FOR_STRING_REFERENCE_TYPE (~ 16-20) 

SOME_JVM_SPECIFIC_HEAP_FOR_STRING_REFERENCE_TYPE contains of all String fields: 
1. reference from string to char array 
2. memoized hash 
3-n. other fields 
n+1. link to class object 
3

一維陣列是單個對象。正如所料,該數組具有通常的對象頭。然而,這個對象頭是12個字節來容納一個4字節的數組長度。然後,如您所期望的那樣,實際的數組數據由元素數量乘以一個元素所需的字節數量組成,具體取決於其類型。對於一個對象引用,一個元素的內存使用量爲4個字節;有關基本類型的內存使用情況的列表,請參閱Java數據類型的頁面。如果數組的總內存使用量不是8字節的倍數,那麼大小會向上舍入到8的下一個重疊(與任何其他對象一樣)。

在這裏看到:How to calculate the memory usage of a Java array

相關問題