zoukankan      html  css  js  c++  java
  • 获取iOS设备的内存状况(转)

    转载自:http://mobile.51cto.com/iphone-285371.htm

     

    iPhone这类移动设备内存有限,而又不能使用交换区,为了不至于导致内存不足而引起运行效率降低或应用崩溃,有时候需要获取当前的内存状况,以决定采用的缓存策略。

    AD:2014WOT全球软件技术峰会北京站 课程视频发布

    由于iPhone这类移动设备内存有限,而又不能使用交换区,为了不至于导致内存不足而引起运行效率降低或应用崩溃,有时候需要获取当前的内存状况,以决定采用的缓存策略。

    不过iOS SDK文档里并没有提及这种底层的API,于是我搜了一番,找到了host_statistics()这个函数。

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

    1. #include <mach/mach.h
    2.  
    3. BOOL memoryInfo(vm_statistics_data_t *vmStats) { 
    4.     mach_msg_type_number_t infoCount = HOST_VM_INFO_COUNT; 
    5.     kern_return_t kernReturn = host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t)vmStats, &infoCount); 
    6.      
    7.     return kernReturn == KERN_SUCCESS; 
    8.  
    9. void logMemoryInfo() { 
    10.     vm_statistics_data_t vmStats; 
    11.      
    12.     if (memoryInfo(&vmStats)) { 
    13.         NSLog(@"free: %u active: %u inactive: %u wire: %u zero fill: %u reactivations: %u pageins: %u pageouts: %u faults: %u cow_faults: %u lookups: %u hits: %u", 
    14.             vmStats.free_count * vm_page_size, 
    15.             vmStats.active_count * vm_page_size, 
    16.             vmStats.inactive_count * vm_page_size, 
    17.             vmStats.wire_count * vm_page_size, 
    18.             vmStats.zero_fill_count * vm_page_size, 
    19.             vmStats.reactivations * vm_page_size, 
    20.             vmStats.pageins * vm_page_size, 
    21.             vmStats.pageouts * vm_page_size, 
    22.             vmStats.faults, 
    23.             vmStats.cow_faults, 
    24.             vmStats.lookups, 
    25.             vmStats.hits 
    26.         ); 
    27.     } 

    调用memoryInfo()就能拿到内存信息了,它的类型是vm_statistics_data_t。这个结构体有很多字段,在logMemoryInfo()中展示了如何获取它们。注意这些字段大都是页面数,要乘以vm_page_size才能拿到字节数。

    顺便再简要介绍下:free是空闲内存;active是已使用,但可被分页的(在iOS中,只有在磁盘上静态存在的才能被分页,例如文件的内存映射,而动态分配的内存是不能被分页的);inactive是不活跃的,实际上内存不足时,你的应用就可以抢占这部分内存,因此也可看作空闲内存;wire就是已使用,且不可被分页的。

    最后你会发现,即使把这些全加起来,也比设备内存少很多,那么剩下的只好当成已被占用的神秘内存了。不过在模拟器上,这4个加起来基本上就是Mac的物理内存量了,相差不到2MB。

    而总物理内存可以用NSRealMemoryAvailable()来获取,这个函数不需要提供参数,文档里也有记载,我就不写演示代码了。

  • 相关阅读:
    大数据学习总结(7)we should...
    大数据学习总结(6)what is our foucus
    洛谷P4632 [APIO2018] New Home 新家(动态开节点线段树 二分答案 扫描线 set)
    BZOJ5249: [2018多省省队联测]IIIDX(线段树 贪心)
    BZOJ2438: [中山市选2011]杀人游戏(tarjan)
    cf1072D. Minimum path(BFS)
    cf1072B. Curiosity Has No Limits(枚举)
    cf567E. President and Roads(最短路计数)
    六校联考考试反思
    BZOJ4010: [HNOI2015]菜肴制作(拓扑排序 贪心)
  • 原文地址:https://www.cnblogs.com/lingzeng/p/4009216.html
Copyright © 2011-2022 走看看