在Swift中获取计算机的可用/空闲内存

问题描述:

我期待在Swift 2.2中获得可用/免费计算机RAM的值。我读过this answer by Viktor Latypov其中建议this question。不幸的是,这个问题问到“物理内存大小”(总内存,即16 GB),但我在寻找“可用/可用内存”。在Swift中获取计算机的可用/空闲内存

我也读了关于NSProcessInfo类,但physicalMemory()函数不是我正在寻找。

任何想法?

+0

这不是一件微不足道的事情。作为一个工作示例,您可以检查此源代码:https://github.com/beltex/SystemKit – Moritz

+0

如果您不介意进入命令行,'vm_stat'可能会提供您正在查找的内容。查看其“man”页面的详细信息 –

+0

@Code不同的是我熟悉'vm_stat'。我宁愿寻找一种通过Swift获取可用内存信息的本地方法,但如果没有其他本地方法,'vm_stat'可能是最后的手段。 – perhapsmaybeharry

在这方面花费太多之后,我无法继续前进,所以我把我迄今为止所拥有的东西放在这里,希望有人能够帮助改进它。

你可以在命令行上类似于vm_stat结果与host_statistics

func vw_page_size() -> (kern_return_t, vm_size_t) { 
    var pageSize: vm_size_t = 0 
    let result = withUnsafeMutablePointer(&pageSize) { (size) -> kern_return_t in 
     host_page_size(mach_host_self(), size) 
    } 

    return (result, pageSize) 
} 

func vm_stat() -> (kern_return_t, vm_statistics) { 
    var vmstat = vm_statistics() 
    var count = UInt32(sizeof(vm_statistics)/sizeof(integer_t)) 
    let result = withUnsafeMutablePointers(&vmstat, &count) { (stat, count) -> kern_return_t in 
     host_statistics(mach_host_self(), HOST_VM_INFO, host_info_t(stat), count) 
    } 

    return (result, vmstat) 
} 


let (result1, pageSize) = vw_page_size() 
let (result2, vmstat) = vm_stat() 

guard result1 == KERN_SUCCESS else { 
    fatalError("Cannot get VM page size") 
} 
guard result2 == KERN_SUCCESS else { 
    fatalError("Cannot get VM stats") 
} 

let total = (UInt(vmstat.free_count + vmstat.active_count + vmstat.inactive_count + vmstat.speculative_count + vmstat.wire_count) * pageSize) >> 30 
let free = (UInt(vmstat.free_count) * pageSize) >> 20 

print("total: \(total)GB") 
print("free : \(free)MB") 

的总内存相符不到什么NSProcessInfo回报。在我的16GB内存的Mac上,返回的总数大约是15.6GB。

计算可用内存的问题更多:有很多不活动和可清除的页面,但Mac OS X不喜欢在没有更多空闲页面前清除它们。所以虽然看起来我只有450MB可用,但如果应用程序需要它,我还可以使用更多功能。不要忘记内存压缩,自小牛队(10.9)开始提供!