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

 

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

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

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

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

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

  1. #include <mach/mach.h>
  2. BOOL memoryInfo(vm_statistics_data_t *vmStats) {
  3. mach_msg_type_number_t infoCount = HOST_VM_INFO_COUNT;
  4. kern_return_t kernReturn = host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t)vmStats, &infoCount);
  5. return kernReturn == KERN_SUCCESS;
  6. }
  7. void logMemoryInfo() {
  8. vm_statistics_data_t vmStats;
  9. if (memoryInfo(&vmStats)) {
  10. 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",
  11. vmStats.free_count * vm_page_size,
  12. vmStats.active_count * vm_page_size,
  13. vmStats.inactive_count * vm_page_size,
  14. vmStats.wire_count * vm_page_size,
  15. vmStats.zero_fill_count * vm_page_size,
  16. vmStats.reactivations * vm_page_size,
  17. vmStats.pageins * vm_page_size,
  18. vmStats.pageouts * vm_page_size,
  19. vmStats.faults,
  20. vmStats.cow_faults,
  21. vmStats.lookups,
  22. vmStats.hits
  23. );
  24. }
  25. }

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

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

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

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

获取iOS设备的内存状况(转)的更多相关文章

  1. 获取iOS设备信息(内存/电量/容量/型号/IP地址/当前WIFI名称)

    1.获取电池电量(一般用百分数表示,大家自行处理就好) 1 2 3 4 -(CGFloat)getBatteryQuantity {         return [[UIDevice current ...

  2. iOS学习——获取iOS设备的各种信息

    不管是在Android开发还是iOS开发过程中,有时候我们需要经常根据设备的一些状态或信息进行不同的设置和性能配置,例如横竖屏切换时,电池电量低时,内存不够时,网络切换时等等,我们在这时候需要进行一些 ...

  3. Unity3D开发之“获取IOS设备所在的国家代码"

    原地址:http://dong2008hong.blog.163.com/blog/static/469688272014021025578/ 在前一段时间游戏开发中需要实现获取IOS设备所在的国家代 ...

  4. 获取iOS设备型号的方法总结

    三种常用的办法获取iOS设备的型号: 1. [UIDevice currentDevice].model (推荐): 2. uname(struct utsname *name) ,使用此函数需要#i ...

  5. 获取ios设备的udid

    今天get的第二个技能~~~ UDID指的是设备的唯一设备识别符,ipa包未上架之前如果不添加udid是无法安装成功的.那么如何快速获取ios设备的udid呢? 今天get的方法是用蒲公英,网址:ht ...

  6. 获取iOS设备唯一标识

    [获取iOS设备唯一标识] 1.已禁用-[UIDevice uniqueIdentifier] 苹果总是把用户的隐私看的很重要.-[UIDevice uniqueIdentifier]在iOS5实际在 ...

  7. 获取iOS设备的型号

    获取iOS设备的型号 需要#import "sys/utsname.h"     structutsname systemInfo;     uname(&systemIn ...

  8. 【转】iOS设备的UDID是什么?苹果为什么拒绝获取iOS设备UDID的应用?如何替代UDID?

    本文讲诉的主要是为什么苹果2011年8月发布iOS 5后就开始拒绝App获取设备的UDID以及UDID替补方案,特别提醒开发者苹果App Store禁止访问UDID的应用上架(相关推荐:APP被苹果A ...

  9. iOS开发的另类神器:libimobiledevice开源包【类似android adb 方便获取iOS设备信息】

    简介 libimobiledevice又称libiphone,是一个开源包,可以让Linux支持连接iPhone/iPod Touch等iOS设备.由于苹果官方并不支持Linux系统,但是Linux上 ...

随机推荐

  1. codeforces 678D D. Iterated Linear Function(水题)

    题目链接: D. Iterated Linear Function time limit per test 1 second memory limit per test 256 megabytes i ...

  2. hdu-5690 All X(快速幂+乘法逆元)

    题目链接: All X Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Others) Pro ...

  3. 4560 NOIP2015 D2T2 子串

    4560 NOIP2015 D2T2 子串  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 有两 ...

  4. 使 div 元素看上去像一个按钮

    使 div 元素看上去像一个按钮 div { appearance:button; -moz-appearance:button; /* Firefox */ -webkit-appearance:b ...

  5. 放弃SCOPE_Identity,使用OUTPUT代替

    最近项目中使用了SCOPE_IDENTITY()来获取新增数据的自动递增ID号. 在运行过程中会不时的发生无法通过SCOPE_IDENTITY()来获取ID号的情况. 尝试着测试又发现不了问题. 今天 ...

  6. leetcode题1Two sum 练习

    题目为: 给一个整数数组, 返回数组中的两数之和等于指定值的两数在数组中的下标. Example: Given nums = [2, 7, 11, 15], target = 9, Because n ...

  7. VHDL操作运算符的优先级顺序

           

  8. 如何防止Android应用代码被窃

    上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/393372.接下来我们将介绍另一种防止a ...

  9. .net上传图片并转成二进制流

    话不多说,直接上代码 <input id="InputFile" style="width: 399px" type="file" r ...

  10. 原生js实现addClass,removeClass,hasClass方法

    function hasClass(elem, cls) { cls = cls || ''; if (cls.replace(/\s/g, '').length == 0) return false ...