記憶體用量的迷思

April 8th, 2007

在 Windows 中,若按 Ctrl-Alt-Del,可叫出工作管理員 (task manager),它可以用來看記憶體用量 (檢視→選擇欄位),不過這功能倒是造成我不少困擾就是了。為什麼呢?因為它給的資訊背後有個很長的故事,然後若是遇到那種半瓶醋的老闆或 reviewer 拿這個數字來做文章的時候,就實在是很圈叉 …

工作管理員中的記憶體用量,較精確的名稱是 working set size,working set 是 Windows Virtual Memory Manager (以下簡稱 VMM) 替這個 process 所 allocate 的 physical memory。(所以看書只看到這裡的人,就會振振有詞地說你的程式很肥要怎樣怎樣 …) Working set 又可分成兩部份,一部份是 private working set,另一部份則是 shared working set,顧名思義 private 就是只供此 process 所使用,而 shared 則是由所有 process 共用。(題外話:因此 .Net 或 Java 程式光看 working set size 一定很肥,因為它們有一大塊 shared working set) 所以要看一個程式的記憶體用量,應該要看它的 private working set,這可以用 Process Explorer 來觀察。

但是,就算是 Private working set 這個數字,也是會騙人的。你可以用 SetProcessWorkingSetSize,把 minimum 和 maximum size 都設成 -1,如此一來 Windows VMM 會將所有 pagable 的 page 全部扔回硬碟去,自然記憶體用量就會變很小。常見的迷思是「記憶體用量小 = 程式快 = 效率高」,這不一定是對的,跑的快的程式要努力減少 page fault,而不是一味追求記憶體用量小。基本上 Windows VMM 效率還蠻好的,而且若你記憶體夠大的話,它反而會先把一些記憶體要來以減少 page fault (所以那堆用 2G RAM 測 Vista 然後狂叫說每個 process 都很肥的,當笑話看看就好)。若你用了 SetProcessWorkingSetSize,但你的程式又不小心要用到已經被 swap 到硬碟上的 page 時要怎麼辦咧?那就 page fault 咩 … 本來可以好好跑的東西莫名其妙 swap out 又 swap in,這樣會快就有鬼了。

所以,記憶體用量是個不錯的參考,但它和你的程式執行效率並沒有絕對的關係。真正有影響的,一是 page fault,另外一個則是 memory leak。我們寫東西要看記憶體用量,主要是用來觀察 private working set size 有沒有持續增加的現象,它是重要的 memory leak 指標。至於程式跑的快不快,那必須由其他的各種因子來分析,page fault 也只是其中一個而已。

好吧,我承認,我也有用 SetProcessWorkingSetSize,因為我做的東西在 service context 裡,平常應該不太會用到。
<謎之聲>
  還有一個原因是因為某人懶得用英文和那些茶包解釋太多 … 噓 …
</謎之聲>

PS. Windows 自己也會幹這種事,若你的程式有 window,當那個 window 被 minimize 的時候,SetProcessWorkingSetSize 會自動被呼叫。所以你的系統剛開機跑的很慢的時候,不要急著把所有視窗最小化,那只會拖慢你的系統罷了 …

Windows, 技術文章 | Comments Jump to the top of this page

Comments are closed.

隨便寫寫大家隨便看看的不出名小格子

舊文索引

站內管理