java - 如何考虑垃圾收集器测试内存使用情况?

标签 java memory memory-management garbage-collection

我正在测试排序算法,我想通过测试 1000 个随机 vector 来测试平均使用的内存。问题是当我在循环内运行大约 20 个随机 vector 时,垃圾收集器运行并且我丢失了计算。请问我该怎么办?我不想手动一一测试=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));

最佳答案

好吧,我来晚了一点,你现在可能已经解决了这个问题,但以防万一其他人想知道,防止 GC 清理对象的最简单方法是保留对对象的引用它在另一个对象中。对于您创建的每个对象,将其添加到某种容器中,例如数组/散列/vector/列表或您的语言支持的任何容器。例如:

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

然后,您将进行与之前相同的测量,将每个 vector 插入到数组中,并从内存使用量中减去 arrayOverhead 以获得最终结果。

关于java - 如何考虑垃圾收集器测试内存使用情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5839145/

相关文章:

java - 如何有效地在 Android 图形中创建调色板颜色的显示位图?

java - 如何在java中设置检查swt.CHECK

java - 动态报告 : How to import the libraries to use with NetBeans in a new project?

c - 如何访问动态分配的结构数组中的项?

.net - 保留内存是否会导致内存不足异常

java - 空闲应用程序的堆大小随时间变小的含义

java - Hibernate在查询Entity2时自动更新Entity1

memory - 使用 ansible 添加交换内存

memory-management - 本地集群上的 Dask 数据加载 : "Worker exceeded 95% memory budget". 重新启动然后 "KilledWorker"

linux - 强制 MongoDB 预取内存