1. 程式人生 > >教你看Mavericks活動監視器裡的記憶體

教你看Mavericks活動監視器裡的記憶體

10.9後這個介面有點變化,出現了一個“已壓縮”專案。為讓更多人瞭解這是怎麼一回事,這裡不用太多術語,某些詞彙轉用中文表達。

實體記憶體:這個不需要解釋了吧

已使用記憶體:這個值就是當前實體記憶體已經被使用的總量,為右邊四項(用用程式記憶體,檔案快取,聯動記憶體,已壓縮)的總和。

虛擬記憶體:為Mach(不是Mac哦)的虛擬儲存器管理系統所管理的虛擬記憶體總量,這個值是 實體記憶體和被轉移到硬碟的資料還有已被壓縮的記憶體的總和。如果等於當前實體記憶體,即說明沒有任何出頁面資料產生。當資料超出實體記憶體的大小,多出的部分就是被移出的量,但是當這種現象緩解以後(已使用記憶體低於實體記憶體)這些資料不會主動恢復到主存。但是當程序嘗試訪問這些被移出的資料時,系統才會將它們恢復到主存。這裡個人猜測一下,出頁面不一定產生I/O讀寫的,試想象一個情況,某個程序需要開啟一張照片,那麼就需要請求系統通過I/O排程將照片載入記憶體,然後提供給程序訪問。那麼當這個程序閒置,照片被關閉(實際上還佔用著檔案快取),當有需要的時候系統將這個照片的快取移出頁面。有一種情況是需要考慮的,照片是否被修改。假如照片是沒有被修改的話,那麼內容就完全跟硬碟同樣位置上的照片一樣,系統不需要再將這照片放回硬碟,只需要在記憶體裡清空資料就可以了,所以這裡儘管是“出頁面”但無I/O資料產生。如果照片被修改的話,當然就會產生I/O資料了。


已使用的交換:最近因程序請求更多記憶體而將部分頁面移出的資料量,判斷記憶體是否足夠,這個值也很重要。如果經常見到有大量資料,那麼就需要新增記憶體了。只有在程序需要更多記憶體且實體記憶體已滿的情況下才會產生這個資料。但是有大量的出頁面資料也不一定會令這個值上漲,因為移出頁面的資料只是單純移出並不是其它程序在請求記憶體。

應用程式記憶體:這部分是程式執行需要的堆疊記憶體的總量。

檔案快取:這部分為作業系統將硬碟本地檔案快取到記憶體上的資料,例如某個程序需要讀寫本地某個檔案,那麼作業系統核心就會將這個檔案快取到記憶體上讓這個程序訪問。

聯動記憶體:這部分為作業系統的核心程序佔用,不可被壓縮。

已壓縮:這個是重點,先從Mach幾種記憶體標識說起。Mach有一個記憶體跟蹤機制,可以跟蹤記憶體資料的使用情況,從而呼叫合適的演算法來分配。

以下部分只是從活動監視器裡移出罷了,現在的10.9還是使用這種模式。
空閒:即沒被使用的記憶體
活躍:剛剛被修過或使用過的資料
非活躍:大部分是被檔案快取和閒置程序佔用
10.9後,當實體記憶體已經被佔滿(大部分非活躍,即檔案快取)後,系統產用的策略是將檔案快取進行壓縮,所以能在“已壓縮”專案裡觀察到資料的產生。當檔案快取不可能再被壓縮了,系統就選擇將部分資料移出頁面,就是將資料轉移到下一級儲存器(即硬碟),這時就產生出頁面。
10.8是沒有使用壓縮技術的,所以當記憶體被佔滿後,系統是會將非活躍記憶體直接移出頁面併產生出頁面資料,無疑加大I/O的壓力。有了記憶體壓縮技術,10.9可以儘可能地將檔案快取到記憶體,讓程序訪問這些檔案的速度增加。



下面解釋一下我這張比較誇張的圖,為了測試記憶體我將一個以前的DEMO來演示一下。正常的狀況是如下圖:
這個CopyFile程式只佔用3.5M,而且一直也只佔用3.5。這個程式的作用是將一個檔案拷貝到指定位置,我這裡用了OS X的安裝映象,大小為5G來測試。從下圖可以看到監視器的檔案快取佔用非常大,這是肯定的了,因為程式在不停將原始檔讀入記憶體。可以看出幾乎是沒有產生多少壓縮資料的。




下面改寫一下這個程式,將自動釋放池註釋掉:
正常的程式在每次從原始檔讀入資料然後寫到磁碟後會將之前讀入記憶體的資料釋放掉,所以程式才能保持在3.5M這樣的佔用。如果關閉了自動釋放池,那麼就如下圖了,CoplyFile這個程式自身佔用的記憶體暴增,加上原始檔的檔案快取,這個數值非常客觀,從而產生了大量的記憶體壓力,和出頁面資料。可以看到這裡的虛擬記憶體已經到10G,也就是已經有2G的資料被移出硬碟了。




日常使用怎麼判斷記憶體是否夠用呢?這個主題非常微妙,因為對OS X來說,記憶體永遠不夠,平時隨便一用實體記憶體就沒有了。但是別灰心,這些實體記憶體用在了合適的地方,主要用做了檔案快取。如果記憶體壓力一直處於地位,且資料未被壓縮,你的記憶體是非常充裕的,即使你這時再新增幾個程序也只是為記憶體壓力增加那麼一點點罷了。只要虛擬記憶體超出部分不會太多,且資料交換量不大,你機器還是保持在最佳狀態。

順便提一下purge這個命令, 在10.9下是需要許可權才能使用,sudo purge。實際上這個命令清空的只是一些沒被修改的檔案快取,例如我上面的那個程式產生的那些資料。執行結束後我都會purge一下,因為我知道清空的確切內容,而這些內容是我不再需要的。這個命令不要濫用,別遇到什麼情況都來一下,這樣就與Mach的內容管理機制作對。

最後補充一下一個小細節,也許你們注意到已使用記憶體是沒超過8G但是卻產生出頁面資料。舉個簡單的例子吧,有八個格子,張三使用了兩個,李四使用了5個。這是王5需要2個,可是沒有多餘空間了,所以只好將張三的格子裡的東西拿到別地方,讓自己的東西放入去。。這樣就產生一個碎片。。。就是所謂的記憶體碎片了。