【问题标题】:Obtain available/free RAM of computer in Swift在 Swift 中获取计算机的可用/空闲 RAM
【发布时间】:2016-04-27 10:46:25
【问题描述】:

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

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

有什么想法吗?

【问题讨论】:

  • 这不是一件小事。对于一个工作示例,您可以检查此源代码:github.com/beltex/SystemKit
  • 如果您不介意进入命令行,vm_stat 可能会提供您正在寻找的内容。查看其man 页面了解详情
  • @Code 不同我熟悉vm_stat。我宁愿寻找一种通过 Swift 获取空闲 RAM 信息的本机方法,但如果没有其他本机方法,vm_stat 可能是最后的手段。
  • 我认为您必须深入研究 Mach 内核。查看host_statistics

标签: swift swift2 ram


【解决方案1】:

在这方面花了太多钱之后,我无法再进一步了,所以我把我目前所拥有的东西放在这里,希望有人可以帮助改进它。

你可以在命令行使用host_statistics得到类似于vm_stat的结果:

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) 开始可用!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多