Приложение Core Foundation, которое я пишу, похоже, потребляет гораздо больше памяти (согласно подсчету "Real Mem" в Activity Monitor), чем я когда-либо выделяю.
Я подтвердил, что мои фактические выделения соответствуют ожидаемым (около 10 МБ) с помощью представления «Распределение байтов в реальном времени» в «Инструментах», но счет «Реальная память» в Activity Monitor показывает> 60 МБ и, очевидно, растет.Я также подтвердил, что нет утечек, также используя Instruments.
Мое приложение поддерживает большую очередь буферов различного размера и постоянно добавляет буферы free () и malloc () по мере добавления/ удаляет элементы очереди.
Прочитав немного о фрагментации кучи, это кажется вероятным объяснением происходящего.Поэтому у меня следующие вопросы:
- Есть ли способ подтвердить это на OS X, например, возможно получить визуальное представление кучи?
- Есть ли необязательный менеджер кучи с низкой фрагментацией для OS X, как для Windows?
Для тех, кто хочет воспроизвести проблему, следующий пример кода довольно хорошо показывает те же симптомы:
#define MAX_SIZE (10*1024*1024)
int main (int argc, const char * argv[])
{
size_t actual_alloc=0;
size_t max_alloc=0;
char *bigbuf=NULL;
size_t bigsize=0;
for (long x=0; x<10000000; x++)
{
if (bigbuf!=NULL)
{
actual_alloc -= bigsize;
free(bigbuf);
}
bigsize = rand() % MAX_SIZE; // alloc random amount up to MAX_SIZE
bigbuf = (char*)malloc(bigsize);
memset(bigbuf, 'x', bigsize);
actual_alloc += bigsize;
if (actual_alloc > max_alloc)
max_alloc = actual_alloc;
if (x%100==0)
{
printf("alloc = %u \t max = %u\n",
(unsigned long)actual_alloc, (unsigned long)max_alloc);
// max_alloc tends towards 10MB,
// "Real Mem" in activity monitor tends towards 60MB
}
}
return 0;
}
Если вы удалите случайный элемент из приведенного выше кода, вы получите около 10 МБ памяти процесса, как и ожидалось.