Счетчик памяти инструмента приложения для iPhone / iPad и счетчик задач - PullRequest
5 голосов
/ 01 сентября 2011

Я использую Instruments Leak Tester, и он дает число для Total Allocations для приложения около 1-3 мег.20 мег.

Полагаю, я просто хочу подтвердить, что task_info возвращает какой-то общий объем памяти, включая стек и т. Д., Где тестер утечки просто сообщает о памяти Malloc / Alloc.

Кроме того,почему номер task_info будет немного увеличиваться во время приложения, когда тестер утечки не увеличивается так сильно ...

    struct task_basic_info info;
    mach_msg_type_number_t size = sizeof(info);
    kern_return_t kerr = task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&info, &size);
    if( kerr == KERN_SUCCESS ) {
    NSLog(@"Memory in use (in bytes): %u", info.resident_size);
    } else {
      NSLog(@"Error with task_info(): %s", mach_error_string(kerr));
    }

1 Ответ

4 голосов
/ 15 декабря 2011

Эти цифры нельзя сравнивать по-настоящему. Даже страницы, относящиеся к (совместно используемому) отображенному в памяти файлу (например, библиотеке), будут считаться резидентными страницами для задачи. Но они будут проигнорированы тестером на утечку.

Важно отметить, что существует концептуальная разница между памятью, доступной для процесса (любым способом: только для чтения, для чтения / записи, исполняемой или нет) и памятью, выделенной вами, в вашей программе. Не вся доступная память связана с фактическим распределением, которое вы сделали (например, с общей библиотекой), и не вся выделенная вами память обязательно находится в памяти (например, большой malloc не зарезервирует для вас физическую память сразу, а только сразу используется).

Вы можете проверить влияние этого, сопоставив анонимную область памяти (или файл), используя:

#include <sys/mman.h>

// allocate anonymous region of memory (1 mb)
char *p = mmap(NULL,1024*1024,PROT_WRITE|PROT_READ,MAP_PRIVATE|MAP_ANON,0,0);

// actually access the memory, or it will not be resident
int sum=0;
for(int i=0;i<1024*1024;i++ ) sum += p[i];

Вы можете легко изменить это на mmap файл, передав fd к mmap и изменив MAP_ANON на MAP_FILE.

Кроме того, предположительно, тестер утечки просматривает вызов malloc (библиотека) и далее до соответствующего free, в то время как фактическое резервирование памяти выполняется только на один уровень ниже, например, используя mmap (системный) вызов, как и выше.

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