ort*_*t11 5 iphone memory-leaks ipad ios
我一直在使用仪器泄漏测试仪,它为一个大约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));
}
Run Code Online (Sandbox Code Playgroud)
这些数字无法真正进行比较。即使属于(共享)内存映射文件(例如库)的页面也将被视为任务的常驻页面。但泄漏测试仪将忽略它们。
需要注意的重要一点是,进程可用的内存(以任何方式:只读、读/写、可执行或不可执行)和您在程序中分配的内存之间存在概念差异。并非所有可用内存都连接到您所做的实际分配(例如共享库),并且并非您分配的所有内存都一定驻留在内存中(例如,大的 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];
Run Code Online (Sandbox Code Playgroud)
您可以通过将 fd 传递给并更改为来轻松地将其更改为mmap
文件。mmap
MAP_ANON
MAP_FILE
另外,大概泄漏测试器会从malloc
(库)调用向前查找,直到相应的free
,而实际的内存预留仅低一级,例如使用与mmap
上面的调用类似的(系统)调用。
归档时间: |
|
查看次数: |
2738 次 |
最近记录: |