2011-04-30 37 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