iPhone / iPad IOS App仪器内存计数与task_info内存计数

时间:2011-09-01 14:20:30

标签: iphone ios ipad memory-leaks

我一直在使用仪器泄漏测试仪,它为一个大约1-3兆的应用程序提供了总分配的编号。

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

我想我只想确认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 个答案:

答案 0 :(得分:4)

这些数字无法真正比​​较。甚至属于(共享的)存储器映射文件(例如库)的页面也将被视为该任务的驻留页面。但泄漏测试员会忽略它们。

需要注意的重要一点是,在程序中,进程可用的内存(以任何方式:只读,读/写,可执行或不可执行)和由您分配的内存之间存在概念差异。并非所有可用内存都连接到您所做的实际分配(例如共享库),并且您分配的所有内存都不一定驻留在内存中(例如,一个大型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];

您可以通过将fd传递给mmap并将mmap更改为MAP_ANON,轻松将其更改为MAP_FILE个文件。

此外,大概是泄漏测试仪从malloc(库)调用向前查找直到相应的free,而实际的内存预留仅在低一级进行,例如使用mmap(系统)调用就像上面那样。