2016-04-27 95 views
2

我期待在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

回答

1

在這方面花費太多之後,我無法繼續前進,所以我把我迄今爲止所擁有的東西放在這裏,希望有人能夠幫助改進它。

你可以在命令行上類似於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)開始提供!