【问题标题】:How to test memory used considering garbage collector?考虑到垃圾收集器,如何测试使用的内存?
【发布时间】:2011-04-30 02:56:23
【问题描述】:

我正在测试一种排序算法,我想通过测试 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));

【问题讨论】:

  • 听起来像是范围问题。可能是您需要的对象应该在更高级别进行实例化。有一些代码要发布吗?
  • 为什么平均使用内存很重要?垃圾收集器在每个 JVM 中都将是一个常量,因此当它运行时,它正在做它应该做的事情,以及它在“真实”运行时会做的事情。丢弃 GC 的结果只会破坏您的结果。
  • 理查德,我添加了代码。但我认为 stackoverflow 有点问题。 Joseph,但我的代码可能会产生负的可用内存:stackoverflow.com/questions/5812785/negative-free-memory
  • 我的问题仍然存在:我不明白您要测试什么,或者您为什么要尝试找出始终成为运行时一部分的东西。
  • 我只是在测试多个案例。我的主程序不会运行 1000 次。我想知道使用的平均内存。这是一项科学测试

标签: java memory memory-management garbage-collection


【解决方案1】:

好的,所以我来晚了一点,您现在可能已经解决了这个问题,但以防万一其他人想知道,防止 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 以获得最终结果。

【讨论】:

  • 哥们,你真是个天才!多谢!在你回答这个问题之前我没有找到解决方案! \o/。我会在几天或几周内尝试。
猜你喜欢
  • 1970-01-01
  • 2017-08-22
  • 2017-03-15
  • 2014-04-21
  • 2021-04-30
  • 2014-05-03
  • 1970-01-01
  • 2020-11-05
  • 2018-01-25
相关资源
最近更新 更多