Как проверить используемую память с учетом сборщика мусора? - PullRequest
0 голосов
/ 30 апреля 2011

Я тестирую алгоритм сортировки и хотел бы проверить среднюю используемую память, протестировав 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));

1 Ответ

2 голосов
/ 26 июля 2011

ОК, поэтому я немного опоздал, и вы, вероятно, уже решили это, но на тот случай, если кто-то еще захочет узнать: Самый простой способ предотвратить очистку объекта 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 из использования памяти, чтобы получить окончательный результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...