2013-12-08 78 views
2

我有一個映射(字符串,字符串),我想查找一個條目和映射的內存大小。我在某處閱讀了儀器可能是有用的(Instrumentation)。有人有想法嗎?計算映射條目的內存

在此先感謝。

+0

你可以做很多事情與儀器儀表,但你的主要目標是什麼?分析器可以告訴你地圖需要多少內存。你的地圖條目是什麼? – Kayaman

+0

鍵和值都是字符串。主要目的是在應用程序運行時計算Map對象的內存消耗。 – STiGMa

+0

我對各種地圖類型的每個項目的相對消費感興趣,所以我可以使速度與內存之間的折衷。 每個地圖類型具有不同的每個值的開銷。 ie:哈希映射對每個值的使用與TreeMap不同,或者數組[鍵,值,鍵,值,...]的最小內存二進制搜索。 – peterk

回答

1

java.util.AbstractMap.SimpleEntry空白實例應該爲64位JVM 24個字節和32位JVM 12個字節。下面是@PeterLawrey的技術,我發現有用的,基於MemoryUsageExamplesTest

System.out.printf("The average memory used by simple entry is %.1f bytes%n", new SizeofUtil() { 
    @Override 
    protected int create() { 
     Map.Entry<String, String> e = new AbstractMap.SimpleEntry<String, String>(null, null); 
     return 1; 
    } 
}.averageBytes()); 
+0

這似乎是工作。謝謝。 – STiGMa

1

使用ObjectOutputStream將對象寫入ByteArrayOutputstream並檢查結果字節數組的長度。

顯然你的Map.Entry需要實現Serializable。

public int getSizeInBytes(Serializable someObject) { 
    ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); 
    ObjectOutputStream objectOut = new ObjectOutputStream(byteOut); 
    objectOut.writeObject(someObject); 
    objectOut.flush(); 
    return byteOut.toByteArray().length; 
} 

public int getSizeBits(Serializable someObject) { 
    return getSizeInBytes(someObject) * 8; 
} 
+0

感謝您的建議。那是另一個可能的解決方案我會試着比較上面提供的解決方案的答案。 – STiGMa