【问题标题】:iPhone / iPad IOS App Instrument Memory Count vs. task_info Memory CountiPhone / iPad IOS App Instrument Memory Count vs. task_info Memory Count
【发布时间】:2011-09-01 14:20:29
【问题描述】:

我一直在使用 Instruments Leak Tester,它为大约 1-3 兆的应用程序提供了总分配数。

但是,当使用 task_info 时,它报告的内存量要大得多,例如 10-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));
    }

【问题讨论】:

  • 您能否确认您是在硬件而不是模拟器上运行。

标签: iphone ios ipad memory-leaks


【解决方案1】:

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

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

【讨论】:

  • 在 Instruments 中,我看到 task_info 返回的内存远小于 VM Tracker 报告的内存。这是因为 task_info 只计算进程的内存,而 VM Tracker 还包括共享内存?
  • 不,很可能您正在查看常驻内存(实际位于 RAM 中的内存页面)与虚拟内存(驻留在交换、磁盘上作为文件或其他任何地方的内存页面)之间的区别; 参见 mmap/MAP_ANON 示例)。在 Mac OS X 上,在终端中运行 vmmap -resident $$ 以查看 shell 的编号($$ 是 shell 的 PID)。据您的进程所知,虚拟页面就在那里,但如果您访问它们,操作系统需要先获取它们。使用mincore(2),您可以测试内存页是否常驻,如果不是,您可以测量访问时的延迟。
  • 举个极端的例子:你可以mmap()整个块设备,比如你的1TB硬盘,然后你的进程可以简单地从内存中访问磁盘内容,而不是使用read()系统调用。然后,VM 跟踪器会说您有 1TB 的虚拟内存,其中只有一小部分驻留在 RAM 中。 (注意:此类实验需要 64 位操作系统)
  • 我明白了,但我想知道为什么 VM Tracker 和 task_info 报告驻留和虚拟的不同值。两种工具都给出了常驻和虚拟的值,但是 task_info 报告的常驻值和虚拟值比 VM Tracker 低,所以我不知道它们实际报告的是什么。
  • 不知道,也许您的测量值会影响您的观测值。你是在同一时刻测量的吗?
猜你喜欢
  • 2018-07-06
  • 1970-01-01
  • 2011-02-12
  • 2016-09-14
  • 2011-05-05
  • 2017-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多