打印IOS设备内存使用情况

由于iPhone这类移动设备内存有限,而又不能使用交换区,为了不至于导致内存不足而引起运行效率降低或应用崩溃,有时候需要获取当前的内存状况,以决定采用的缓存策略。
不过iOS SDK文档里并没有提及这种底层的API,于是我搜了一番,找到了 host_statistics() 这个函数。

参数虽然很多,但基本上都是固定的值,我也就不解释,直接上代码了:

 

复制代码
#include <mach/mach.h>

BOOL memoryInfo(vm_statistics_data_t *vmStats) {
    mach_msg_type_number_t infoCount = HOST_VM_INFO_COUNT;
    kern_return_t kernReturn = host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t)vmStats, &infoCount);
    
     return kernReturn == KERN_SUCCESS;
}

void logMemoryInfo() {
    vm_statistics_data_t vmStats;
    
     if (memoryInfo(&vmStats)) {
        NSLog( @" free: %u\nactive: %u\ninactive: %u\nwire: %u\nzero fill: %u\nreactivations: %u\npageins: %u\npageouts: %u\nfaults: %u\ncow_faults: %u\nlookups: %u\nhits: %u ",
            vmStats.free_count * vm_page_size,
            vmStats.active_count * vm_page_size,
            vmStats.inactive_count * vm_page_size,
            vmStats.wire_count * vm_page_size,
            vmStats.zero_fill_count * vm_page_size,
            vmStats.reactivations * vm_page_size,
            vmStats.pageins * vm_page_size,
            vmStats.pageouts * vm_page_size,
            vmStats.faults,
            vmStats.cow_faults,
            vmStats.lookups,
            vmStats.hits
        );
    }
}
复制代码

 

调用memoryInfo()就能拿到内存信息了,它的类型是 vm_statistics_data_t 。这个结构体有很多字段,在logMemoryInfo()中展示了如何获取它们。注意这些字段大都是页面数,要乘以vm_page_size才能拿到字节数。
顺便再简要介绍下:free是空闲内存;active是已使用,但可被分页的(在iOS中,只有在磁盘上静态存在的才能被分页,例如文件的内存映射,而动态分配的内存是不能被分页的);inactive是不活跃的,也就是程序退出后却没释放的内存,以便加快再次启动,而当内存不足时,就会被回收,因此也可看作空闲内存;wire就是已使用,且不可被分页的。此外,这篇 文档 也有作介绍。

最后你会发现,即使把这些全加起来,也比设备内存少很多,那么剩下的只好当成已被占用的神秘内存了。不过在模拟器上,这4个加起来基本上就是Mac的物理内存量了,相差不到2MB。
而总物理内存可以用NSRealMemoryAvailable()来获取,这个函数不需要提供参数,文档里也有记载,我就不写演示代码了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值