2011-01-26 23 views
2

的特定列表內存使用我有simples的POJO(用戶類)與約15簡單字段& 1 ArrayList的一個列表。 那些代表用戶&可能有100人或他們的1000將存儲在內存中,以避免來自外部系統的每一次檢索。 (我正在使用Ehcache)爲對象

我想知道junit測試有多少內存用於這些用戶的K列表。 我有一個像一個即使是那些1000簡單的POJO是不以任何方式威脅(即小於100 KO)

預先感謝您的anwser直覺。 我真的很感謝你的幫助。

+0

爲什麼你想用JUnit測試做到這一點?這些值很可能取決於JVM版本/供應商/標誌_和_ CPU架構。對於isntance,Sun的JVM上的64位版!= Sun的JVM在32位的Linux!= Sun的JVM在64位的Linux與CompressedOops。你最好的就是每個案例的分析。 – 2011-01-26 09:12:02

+0

也看到http://stackoverflow.com/questions/2062553/java-object-creation-and-memory-size – 2011-01-26 09:12:52

+0

我知道,這取決於很多事情,但我想有我自己的建築及一個有些真正的價值我們正在生產中使用。我假設使用N個字節的K個簡單用戶在另一個體繫結構上可能不會消耗100倍以上。 – 2011-01-26 10:07:31

回答

11

你可以計算出JRE之前使用的內存與您共創之後你的對象,爲了近似多少字節是如何被使用的對象。

System.gc(); 
System.runFinalization(); 
Thread.sleep(1000); 
long before = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); 

//build object here 

System.gc(); 
System.runFinalization(); 
Thread.sleep(1000); 
long after = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); 

long objectSize = after - before; 
0

你可以把它們寫到ByteOutputStream,然後得到字節數組,並檢查它的長度。這將工作,如果你的pojos是可序列化的。

0

如果您想進行簡單測試,可以將新尺寸設置爲較大尺寸,然後執行以下操作。 這隻適用於您的新尺寸遠大於您創建的數據。 例如

-XX:新尺寸=1克-verbosegc

值將是正確的前提是你看不到任何GC。

long before = Runtime.getRuntime().freeMemory(); 

//build object here 

long used = before - Runtime.getRuntime().freeMemory(); 

注意:這裏假定您不生成臨時對象。