iPhone / iPad的IOS应用程序仪器内存计数与task_info内存计数

我一直在使用仪器泄漏testing仪,它给总分配一个1-3兆左右的应用程序的数字。

但是,使用task_info时,它会报告更大的内存量,如10-20兆。

我想我只是想确认task_info正在返回某种types的内存,包括堆栈/ etc,其中泄漏testing器只报告Malloc / Alloc内存。

另外,为什么在应用程序中,当泄漏testing程序没有增加那么多的时候,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)); } 

这些数字是无法比较的。 即使属于(共享)内存映射文件(例如库)的页面也将被视为该任务的常驻页面。 但他们会被泄漏testing仪忽略。

需要注意的重要一点是,在程序中,进程可用的内存(以任何方式:只读,读/写,可执行或不可执行)和内存分配之间存在概念上的区别。 并不是所有可用的内存都连接到你所做的实际分配(例如共享库),并不是你分配的所有内存都必须驻留在内存中(例如,一个大的malloc不会立即为你保留物理内存,而是只要它用来)。

您可以使用以下方法testing内存(或文件)的匿名区域来testing此影响:

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

您可以轻松地通过将MAP_ANON传递给mmap并将MAP_ANON更改为MAP_ANON来将其更改为mmap文件。

此外,大概泄漏testing仪从malloc (库)调用看起来直到相应的free ,而实际的内存预留是低一级完成,例如使用一个像上面那样的mmap (系统)调用。