擷取iOS裝置的記憶體狀況

來源:互聯網
上載者:User

標籤:http   io   os   使用   ar   檔案   sp   div   2014   

轉載自: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\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()來擷取,這個函數不需要提供參數,文檔裡也有記載,我就不寫示範代碼了。

擷取iOS裝置的記憶體狀況(轉)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.