2011-04-30 39 views
0

我在測試排序算法,我想通過測試1000個隨機向量來測試平均使用的內存。問題是當我在循環內部運行20個隨機向量時,垃圾收集器運行並且我失去了計算。我該怎麼做?我不想一個一個的測試手動= X。如何測試使用考慮垃圾收集器的內存?

for(int j = 0; j < 1000; j++) 
{ 
    int vetOriginal[] = Generate(); 
    for(int i = 0; i < 10; i++) 
    { 
     int vetParaTeste[] = vetOriginal.clone(); 
     long memoriaInicial = Runtime.getRuntime().freeMemory()/1024; 
     mergeSort(vetParaTeste); 
     somaMemoriaKB += memoriaInicial - Runtime.getRuntime().freeMemory()/1024; 
    } 
} 
System.out.println("Average memory used: " + somaMemoriaKB/(1000* 10)); 
+0

聽起來像範圍問題。這可能是你需要的對象應該在更高的層次上實例化。有一些代碼發佈? – 2011-04-30 03:01:36

+0

爲什麼平均使用的內存更重要?垃圾收集器將在每個JVM中成爲一個常量,因此當它運行時,它正在做它應該達到的目標,以及它在「真實」運行時會做什麼。拋棄GC的結果只會破壞你的結果。 – 2011-04-30 03:05:08

+0

Richard,我添加了代碼。但我認爲stackoverflow是一個小bug。約瑟夫,但我的代碼可能會產生消極的自由內存:http://stackoverflow.com/questions/5812785/negative-free-memory – Seva 2011-04-30 03:12:11

回答

2

OK,所以我有點晚了這裏,你有可能已經解決了這個,但以防萬一有人想知道,最簡單的方法來阻止GC清理的目的是在另一個對象中保留對它的引用。對於您創建的每個對象,都將它添加到某種容器,如數組/散列/向量/列表或您的語言支持的任何對象。例如:

var items as Array[0..numberOfItems] 

for (var i = 0; i < numberOfItems; i++) { 
    var vector = createVector() 
    items[i] = vector; 
} 

容器會增加一些開銷,所以您需要先測量它然後從最終輸出中減去該數量。例如:

var baseMemory = measureMemory() 
var numberOfItems = 1000 

// create an array of a known size (eg 1000 bytes) 
var arrayOfKnownSize as Array[0..numberOfItems] 

for (var i = 0; i < numberOfItems; i++) 
    arrayOfKnownSize[i] = Int32(0xFF) 

// calculate the size occupied by just the data ... 
var expectedMemory = sizeOf(Int32) * numberOfItems 

// ... subtract this from the total memory usage and you will get the overhead 
var arrayOverhead = measureMemory() - baseMemory - expectedMemory 

// now measure the memory used by an array of vectors 
baseMemory = measureMemory() 
var vectors as Array[0..numberOfItems] 

for (var i = 0; i < numberOfItems; i++) { 
    var vector = createVector() 
    vectors[i] = vector; 
} 

// subtract the array overhead from the memory usage 
var usedMemory = measureMemory() - baseMemory - arrayOverhead 
var averageMemory = usedMemory/numberOfItems 

你會然後做相同的測量像你一樣,每一個載體插入到一個數組中,並從內存使用量減去arrayOverhead,讓您的最終結果。

+0

夥計,你是一個真正的!非常感謝!在回答這個問題之前,我沒有找到解決方案! \ O /。我會在幾天或一週內嘗試。 – Seva 2011-07-27 13:51:28