获取iOS设备的内存状况

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

由于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\nactive: %u\ninactive: %u\nwire: %u\nzero fill: %u\nreactivations: %u\npageins: %u\npageouts: %u\nfaults: %u\ncow_faults: %u\nlookups: %u\nhits: %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()来获取,这个函数不需要提供参数,文档里也有记载,我就不写演示代码了。

责任编辑:佚名 来源: keakon的涂鸦馆
相关推荐

2011-07-26 17:50:07

iOS 设备

2014-09-22 10:55:14

2011-08-03 11:21:30

iOS程序 测试 UDID

2011-05-11 11:55:02

应用交付数据中心负载均衡

2015-03-13 09:30:23

iOS内存管理

2017-02-09 21:24:22

iOS内存管理

2018-07-23 09:26:08

iOS内存优化

2011-09-16 16:55:08

iOS应用Evoz

2017-03-07 10:15:35

iOS内存管理开发

2017-03-19 22:13:10

WebAssemblyJavaScript编程

2023-10-27 16:12:29

2024-04-16 00:13:52

JS网络状态ts类

2011-09-01 16:06:41

ios

2010-07-01 22:12:27

移动设备iOS 迈克菲

2013-06-27 10:57:45

判断当前iOS设备iOS开发移动开发

2009-09-03 17:51:34

C#获取设备的ID

2011-07-28 10:01:19

IOS 内存优化

2011-07-21 14:42:45

iOS UIViewCont 内存

2016-04-11 09:30:49

内存管理ios开发

2011-07-28 14:45:03

iOS图像显示
点赞
收藏

51CTO技术栈公众号