Я пытаюсь лучше понять, почему куча Windows Vista ведет себя так, как она работает. Рассмотрим следующую очень простую программу:
#include <vector>
#define NUM_ALLOCS 10000000
int _tmain(int argc, _TCHAR* argv[])
{
for (int iteration=0; iteration<10000; ++iteration) {
std::vector<unsigned char *> buffer;
buffer.reserve(NUM_ALLOCS);
for (int i=0;i<NUM_ALLOCS;++i) {
buffer.push_back(new unsigned char);
}
for (int i=0;i<NUM_ALLOCS;++i) {
delete buffer[i];
}
}
return 0;
}
По сути, это цикл, который для каждой итерации выделяет много блоков из 1 байта, а затем освобождает их. Естественно, использование памяти этой программой увеличивается при выделении буферов, а затем уменьшается при освобождении буферов.
Поведение, которое я наблюдаю в 64-разрядной версии Windows Vista, заключается в том, что пиковое использование памяти (согласно отчету диспетчера задач или vmmap ) остается примерно постоянным с течением времени, тогда как наименьшее использование памяти, о котором сообщалось, растет пока он не приблизится к пиковому использованию памяти.
В 64-разрядной версии Windows 7 минимальное зарегистрированное использование памяти не увеличивается со временем.
Редактировать: Я тестировал на двух 64-разрядных компьютерах с Windows Vista с 8 ГБ / 4 ГБ оперативной памяти и на одном 64-разрядном компьютере с Windows 7 с 4 ГБ оперативной памяти. Я проверил машину на 8 ГБ со сценариями с низким и высоким использованием памяти.
Редактировать: я построил приведенный выше пример с Visual Studio 2005 и 2010 с тем же результатом.
Этот пример не делает ничего полезного, но сценарий использования памяти похож (хотя и сильно сжат) на мою программу, для которой я пытался выяснить, почему она использует намного больше памяти, чем на самом деле делает. Из того, что я могу сказать, память хранится менеджером кучи.
Кто-нибудь имеет представление о механизмах кучи?
Нужно ли делать что-то еще, чтобы убедить менеджер кучи полностью освободить использованную память кучи? Есть ли альтернативные стратегии, которые я должен использовать, например, создать отдельную кучу и затем уничтожить ее?
Любые комментарии или идеи приветствуются!