在Swift中获取可用/免费的计算机RAM

时间:2016-04-27 10:46:25

标签: swift swift2 ram

我希望在Swift 2.2中获得可用/免费计算机RAM的价值。我看过this answer by Viktor Latypov,其中提到this question。不幸的是,问题是“物理内存大小”(总内存,即16 GB),但我正在寻找“可用/可用内存”。

我也读过NSProcessInfo类,但physicalMemory()函数不是我想要的。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

在花了太多钱之后,我无法继续前进,所以我把目前为止所做的事情放在这里,希望有人可以帮助改进它。

您可以在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可用,但如果应用程序需要它,我可以使用更多。并且不要忘记自Mavericks(10.9)以来的内存压缩!