Eri*_*ric 5 memory heap-fragmentation ios
我显然导致设备(iPad)耗尽内存,所以它放弃了我的应用程序.我正在试图理解正在发生的事情,因为Instruments正在告诉我,我使用的是大约80Mb,并且设备上没有运行其他应用程序.
我发现这段代码片段要求iOS下的Mach系统获取内存统计信息:
#import <mach/mach.h>
#import <mach/mach_host.h>
static void print_free_memory () {
mach_port_t host_port;
mach_msg_type_number_t host_size;
vm_size_t pagesize;
host_port = mach_host_self();
host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
host_page_size(host_port, &pagesize);
vm_statistics_data_t vm_stat;
if (host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size) != KERN_SUCCESS)
NSLog(@"Failed to fetch vm statistics");
/* Stats in bytes */
natural_t mem_used = (vm_stat.active_count +
vm_stat.inactive_count +
vm_stat.wire_count) * pagesize;
natural_t mem_free = vm_stat.free_count * pagesize;
natural_t mem_total = mem_used + mem_free;
NSLog(@"used: %u free: %u total: %u", mem_used, mem_free, mem_total);
}
Run Code Online (Sandbox Code Playgroud)
当我使用此函数获取三个内存值时,我发现即使mem_used总数没有发生太大变化,mem_total值也会下降.这是两个连续的输出行:
<Warning>: used: 78585856 free: 157941760 total: 236527616
Run Code Online (Sandbox Code Playgroud)
一些代码执行....
<Warning>: used 83976192 free: 10551296 total: 94527488
Run Code Online (Sandbox Code Playgroud)
所以我从157MB的可用内存到10MB的可用内存,但我的使用率仅从78MB增加到84MB.总内存从236MB减少到94MB.
这对任何人都有意义吗?在此期间,设备上没有运行其他应用程序,该设备应该基本上完全专用于我的应用程序.
在两次内存检查之间执行的所有代码都是本机C++代码,它与任何Apple框架都没有任何交互.确实有很多很多调用内存系统从C++堆中分配和释放对象,但是如图所示,最后只分配了大约4MB的额外内存,其余的都被释放/删除.
可能是堆碎片正在消耗丢失的内存吗?即堆是如此碎片,以至于块开销消耗了所有额外的,未计入的内存?
有没有人见过这种行为?
谢谢,
-Eric
And*_*sev 10
您应该使用task_info而不是host_statistics检索应用程序的内存使用情况:
# include <mach/mach.h>
# include <mach/mach_host.h>
void dump_memory_usage() {
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( @"task_info: 0x%08lx 0x%08lx\n", info.virtual_size, info.resident_size );
}
else {
NSLog( @"task_info failed with error %ld ( 0x%08lx ), '%s'\n", kerr, kerr, mach_error_string( kerr ) );
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5854 次 |
| 最近记录: |