确定 iOS 设备上的可用 RAM 量

Posted

技术标签:

【中文标题】确定 iOS 设备上的可用 RAM 量【英文标题】:Determining the available amount of RAM on an iOS device 【发布时间】:2011-06-28 03:02:06 【问题描述】:

您可能已经看到许多“系统信息”应用程序,它们显示诸如剩余电池寿命之类的信息,甚至显示内存等系统信息。

以类似的方式,是否有任何方法可以从我的应用中检索当前可用 RAM 量,以便我可以更好地决定何时最好转储或保留某些视图以避免内存警告?

【问题讨论】:

或者你搜索的不够好 ;-) ***.com/questions/3823266/… @Bavarious:这个问题和其他相关问题的答案在很大程度上忽略了重点,即您可能希望使用更多 RAM 来使您的应用程序更具响应性或媒体丰富等,但仅在可以舒适地承受额外负载的设备上。 “配置文件”和“使用更少的 RAM”的建议并没有削减它。 @Eric:我遇到了类似的问题,最终自己找到了答案。见here。请注意,我正在寻找总系统 RAM;如果这与您的要求相同,我不会,但我希望这会有所帮助。 这能回答你的问题吗? Programmatically retrieve memory usage on iPhone 见only solution for extensions(没有错误结果) 【参考方案1】:

这适用于 Swift 4。

这里真正重要的区别是:它在乘法之前强制转换为 Int64,否则会很快溢出,尤其是在使用 PC 内存的模拟器中运行它时。

var pagesize: vm_size_t = 0

let host_port: mach_port_t = mach_host_self()
var host_size: mach_msg_type_number_t = mach_msg_type_number_t(MemoryLayout<vm_statistics_data_t>.stride / MemoryLayout<integer_t>.stride)
host_page_size(host_port, &pagesize)

var vm_stat: vm_statistics = vm_statistics_data_t()
withUnsafeMutablePointer(to: &vm_stat)  (vmStatPointer) -> Void in
    vmStatPointer.withMemoryRebound(to: integer_t.self, capacity: Int(host_size)) 
        if (host_statistics(host_port, HOST_VM_INFO, $0, &host_size) != KERN_SUCCESS) 
            NSLog("Error: Failed to fetch vm statistics")
        
    


/* Stats in bytes */
let mem_used: Int64 = Int64(vm_stat.active_count +
        vm_stat.inactive_count +
        vm_stat.wire_count) * Int64(pagesize)
let mem_free: Int64 = Int64(vm_stat.free_count) * Int64(pagesize)

【讨论】:

您好,我尝试了您的示例,但 mem_used 的值非常不同。当我将它转换为 MB 时,它给了我 120MB,而在 XCode 中,它给了我 30MB。知道为什么吗? 谢谢。只是评论,我认为 Int64 应该是 UInt64。 @Minos 我不同意。请记住,2^63 已经是 9,223,372,036,854,775,808 并且 Int64 作为有符号整数具有以下优势:某些减法在低于 0 时不会产生异常。【参考方案2】:
#import <mach/mach.h>
#import <mach/mach_host.h>

void print_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");
    

    /* Stats in bytes */ 
    natural_t mem_used = (vm_stat.active_count +
                          vm_stat.inactive_count +
                          vm_stat.wire_count) * pagesize;
    natural_t mem_free = vm_stat.free_count * pagesize;
    natural_t mem_total = mem_used + mem_free;
    NSLog(@"used: %u free: %u total: %u", mem_used, mem_free, mem_total);

请注意,此调用不考虑 gpu 正在使用的内存。如果您看到的大小小于预期的系统内存。它很可能是分配的图形内存。

【讨论】:

我很震惊,我是第一个在这段代码上给你点的人。它在我的 iPhone 上工作得很好,对我有很大的帮助!我希望我能给你10分!!! 我确实找到了另一个可以添加到上面的命令,以获取任务统计信息:struct task_basic_info info; if(dump_memory_usage(&info)) fm.resident_size = (size_t)info.resident_size; fm.virtual_size = (size_t)info.virtual_size; 如果你想获得设备拥有的真实总内存,只需使用 [NSProcessInfo processInfo].physicalMemory。 @Steve,提供计算机上的物理内存量。 - (unsigned long long)physicalMemory 这如何告诉您您的应用程序正在使用多少内存? 我认为总内存计算不准确。与[NSProcessInfo processInfo].physicalMemory 交叉引用它,您会发现后者与设备的市场内存规格更加一致。【参考方案3】:

您可以检查 ios 设备中可用的 RAM 内存

    #import mach\mach.h
    #import mach\mach_host.h

     static natural_t get_free_memory(void)  
       
       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");  
         return 0;  
         
       /* Stats in bytes */  
       natural_t mem_free = vm_stat.free_count * pagesize;  
       return mem_free;  
       

【讨论】:

你知道吗,这会考虑GPU使用的内存,还是不考虑? 为什么在 mach\mach.h 中使用反斜杠?

以上是关于确定 iOS 设备上的可用 RAM 量的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中测量 iOS 设备上的抖动量?

如何在 android 设备中获取当前可用的免费 RAM [重复]

Android 可用内存

Flash 移动应用程序:设备和分析器上的不同 RAM 消耗

iOS8在iPad Air上使用HealthKit时如何修复“此设备上的健康数据不可用”

iOS8在iPad Air上使用HealthKit时如何修复“此设备上的健康数据不可用”