我显然导致设备(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);
}
当我使用这个函数来获取三个内存值时,我发现 mem_total 的值正在下降,即使 mem_used 的总值没有太大变化。这是两个连续的输出行:
<Warning>: used: 78585856 free: 157941760 total: 236527616
一些代码执行....
<Warning>: used 83976192 free: 10551296 total: 94527488
所以我突然从 157MB 的可用内存增加到 10MB 的可用内存,但我的使用量只从 78MB 增加到 84MB。总内存从 236MB 减少到 94MB。
这对任何人都有意义吗?在此期间设备上没有运行其他应用程序,该设备应该基本上完全专用于我的应用程序。
在两次内存检查之间执行的所有代码都是本机 C++ 代码,与任何 Apple 框架完全没有交互。确实有很多很多调用内存系统来从 C++ 堆分配和释放对象,但正如所见,最终只分配了大约 4MB 的额外内存,其余的都被释放/删除。
可能是堆碎片正在消耗丢失的内存吗?即,堆是否只是如此碎片化,以至于块开销正在消耗所有额外的、未计入的内存?
有没有其他人看到过这种行为?
谢谢,
-埃里克