如何测试使用考虑垃圾收集器的内存?
问题描述:
我在测试排序算法,我想通过测试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));
答
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
听起来像范围问题。这可能是你需要的对象应该在更高的层次上实例化。有一些代码发布? – 2011-04-30 03:01:36
为什么平均使用的内存更重要?垃圾收集器将在每个JVM中成为一个常量,因此当它运行时,它正在做它应该达到的目标,以及它在“真实”运行时会做什么。抛弃GC的结果只会破坏你的结果。 – 2011-04-30 03:05:08
Richard,我添加了代码。但我认为stackoverflow是一个小bug。约瑟夫,但我的代码可能会产生消极的自由内存:http://stackoverflow.com/questions/5812785/negative-free-memory – Seva 2011-04-30 03:12:11