iPhone / iPad IOS App Recuento de la memory del instrumento vs. task_info Recuento de la memory

He estado usando el probador de fugas de instrumentos y da un número para las asignaciones totales para una aplicación de alnetworkingedor de 1-3 megas.

Pero, al usar task_info está reportando cantidades de memory mucho mayores como 10-20 meg.

Creo que solo quiero confirmar que task_info está devolviendo algún tipo de memory total, incluida la stack / etc, donde el probador de fugas acaba de informar la memory de Malloc / Alloc.

Además, ¿por qué el número task_info boostá bastante durante la aplicación cuando el probador de fugas no aumenta tanto …

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)); } 

Esos numbers no se pueden comparar realmente. Incluso las páginas que pertenecen a un file cartografiado de memory (compartido) (por ejemplo, una biblioteca) contarán como páginas residenciales para la tarea. Pero serán ignorados por el probador de fugas.

Lo importante a tener en count es que hay una diferencia conceptual entre la memory disponible para el process (de cualquier manera: de forma sencilla, de lectura / escritura, ejecutable o no) y la memory asignada por usted, dentro de su progtwig. No toda la memory disponible está conectada a una asignación real que hizo (p. Ej., Una biblioteca compartida) y no toda la memory que asigna es necesariamente residente en la memory (por ejemplo, un gran malloc no reservará la memory física de inmediato, sino tan pronto como sea posible se usa)

Puede probar el impacto de esto al mapear una región anónima de memory (o un file) usando:

 #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]; 

Puede cambiar fácilmente esto para mmap un file, pasando un fd a mmap y cambiando MAP_ANON a MAP_FILE .

También, presumiblemente, el probador de fugas se ve desde la llamada malloc (biblioteca) hacia adelante hasta un correspondiente correspondiente, mientras que la reserva de memory real se realiza solo un nivel más bajo, por ejemplo, usando una llamada mmap (sistema) como la anterior.