【问题标题】:get free ram on iOS 9?在 iOS 9 上获得免费内存?
【发布时间】:2016-02-07 22:27:29
【问题描述】:

我正在尝试在 iOS 设备上获取免费内存,但下面的代码在 iOS 9、iphone 5s 设备上为我提供了 34MB 内存,即使只有 1 个正在使用 98MB 内存的应用程序正在运行。下面的代码中是否有一些错误?

natural_t get_free_memory ()
{
mach_port_t host_port;
mach_msg_type_number_t host_size;
vm_size_t pagesize;

host_port = mach_host_self();
host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
host_page_size(host_port, &pagesize);        

vm_statistics_data_t vm_stat;

if (host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size) != KERN_SUCCESS) {
    NSLog(@"Failed to fetch vm statistics");
}
natural_t mem_free = vm_stat.free_count * pagesize;
return mem_free;
}

【问题讨论】:

  • 你的代码和stackoverflow.com/questions/5012886/…一模一样,所以不太可能有bug。
  • @matt 你能试试这个代码吗?这段代码告诉我,当后台没有应用程序并且当前应用程序中唯一的代码是获取可用内存的代码时,我在 iOS 9 上的 iPhone 5s 上有 134MB 内存。
  • @anuj 听起来您可能对虚拟内存系统中的“免费”意味着什么有误解。

标签: ios iphone ios9


【解决方案1】:

iOS 是一个 Unix 系统(源自 BSD),具有多任务和复杂的内存管理功能。

手机上只运行一个进程的可能性很小。即使没有应用程序正在运行(即您通过在任务切换器中“向上滑动”所有其他应用程序来主动终止所有其他应用程序),仍有大量守护程序仍在运行以执行各种任务。

除此之外,还有内核使用的内存,以及通过各种路径用作缓存的内存。可用内存根本不代表可用内存,因为系统会尝试将尽可能多的内存用于缓存和其他类似目的。

我有一个 FreeBSD 盒子(FreeBSD 紧随 Mac OS X,可能是最接近 iOS 的操作系统),64 GB 的 RAM 基本上什么都不做,它报告 848 MB 可用...但 56 GB“非活动”内存,超过 1 GB 的“缓存”和 1.5 GB 的“缓冲区”。大多数内存实际上是可用的,只是不被认为是“免费的”,因为操作系统实际上有其页面的映射(但如果需要,会释放它们)。

【讨论】:

    【解决方案2】:

    这是一份完整的报告:

    vm_statistics_data_t vmStats;
    mach_msg_type_number_t infoCount = HOST_VM_INFO_COUNT;
    host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t)&vmStats, &infoCount);
    
    int availablePages            = vmStats.free_count;
    float availableMemory         = (float)availablePages*vm_page_size/1024./1024.;
    
    int activePages               = vmStats.active_count;
    float activeMemory            = (float)activePages*vm_page_size/1024./1024.;
    
    int inactivePages             = vmStats.inactive_count;
    float inactiveMemory          = (float)inactivePages*vm_page_size/1024./1024.;    
    
    int wirePages                 = vmStats.wire_count;
    float wireMemory              = (float)wirePages*vm_page_size/1024./1024.; 
    
    int pageoutsPages             = vmStats.pageouts;
    float pageoutsMemory          = (float)pageoutsPages*vm_page_size/1024./1024.;
    
    int hitsPages                 = vmStats.hits;
    float hitsMemory              = (float)hitsPages*vm_page_size/1024./1024.;
    
    int purgeable_countPages      = vmStats.purgeable_count;
    float purgeable_countMemory   = (float)purgeable_countPages*vm_page_size/1024./1024.;
    
    int speculative_countPages    = vmStats.speculative_count;
    float speculative_countMemory = (float)speculative_countPages*vm_page_size/1024./1024.;
    

    【讨论】:

    • 你能试试这个代码吗?这段代码告诉我,当后台没有应用程序并且当前应用程序中唯一的代码是获取可用内存的代码时,我在 iOS 9 上的 iPhone 5s 上有 134MB 内存。
    猜你喜欢
    • 2019-03-02
    • 2018-01-31
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多