Как я могу узнать, сколько адресного пространства потребляет приложение, и сообщить об этом пользователю?
-
01-07-2019 - |
Вопрос
Я пишу диспетчер памяти для приложения в составе команды из двадцати с лишним программистов.У нас заканчивается квота памяти, и нам нужно иметь возможность видеть, что происходит, поскольку, похоже, мы используем всего около 700 МБ.Мне нужно иметь возможность сообщать, к чему все это приводит - фрагментация и т.д.Есть какие-нибудь идеи?
Решение
Вы можете использовать для этого существующие инструменты отладки памяти, я нашел средство проверки памяти 1 весьма полезный, он способен отслеживать распределение как на уровне API (куча, новый ...), так и на уровне операционной системы (виртуальная память) и показывать карты виртуальной памяти.
Другой вариант, который я также нашел очень полезным, - это возможность создать карту всего виртуального пространства на основе функции VirtualQuery.Мой код для этого выглядит примерно так:
void PrintVMMap()
{
size_t start = 0;
// TODO: make portable - not compatible with /3GB, 64b OS or 64b app
size_t end = 1U<<31; // map 32b user space only - kernel space not accessible
SYSTEM_INFO si;
GetSystemInfo(&si);
size_t pageSize = si.dwPageSize;
size_t longestFreeApp = 0;
int index=0;
for (size_t addr = start; addr<end; )
{
MEMORY_BASIC_INFORMATION buffer;
SIZE_T retSize = VirtualQuery((void *)addr,&buffer,sizeof(buffer));
if (retSize==sizeof(buffer) && buffer.RegionSize>0)
{
// dump information about this region
printf(.... some buffer information here ....);
// track longest feee region - usefull fragmentation indicator
if (buffer.State&MEM_FREE)
{
if (buffer.RegionSize>longestFreeApp) longestFreeApp = buffer.RegionSize;
}
addr += buffer.RegionSize;
index+= buffer.RegionSize/pageSize;
}
else
{
// always proceed
addr += pageSize;
index++;
}
}
printf("Longest free VM region: %d",longestFreeApp);
}
Другие советы
Вы также можете узнать информацию о кучах в процессе с помощью Heap32ListFirst/Heap32ListNext и о загруженных модулях с помощью Module32First/Module32Next из справочного API инструмента.
"Инструментальная справка" создана в Windows 9x.Исходным информационным API процесса в Windows NT был PSAPI, предлагающий функции, которые частично (но не полностью) перекрываются со справочной программой.
Наше (огромное) приложение (игра для Win32) недавно начало выдавать исключения "Недостаточно квоты", и мне было поручено выяснить, куда уходит вся память.Это не тривиальная работа - этот вопрос и этот это были мои первые попытки выяснить это.Поведение кучи неожиданно, и точное отслеживание того, сколько квоты вы использовали и сколько доступно, пока оказалось невозможным.На самом деле, это все равно не особенно полезная информация - "квота" и "куда что-то положить" - это тонко и раздражающе разные понятия.Принятый ответ настолько хорош, насколько это возможно, хотя перечисление куч и модулей также удобно.Я использовал DebugDiag Отладочный параметр из MS можно увидеть истинный ужас ситуации и понять, как трудно на самом деле тщательно все отслеживать.