2013.07.26 09:05

想讓電腦更快更順嗎?系統最佳化,深入Windows記憶體管理

ADVERTISEMENT

正確解讀記憶體佔用率

了解分頁檔的產生背景及其對系統會帶來的影響後,接下來就要找出正確的尺寸。以交由Windows自行管理的分頁檔大小為例,它最小不會低於實體記憶體的容量,最大則是不會超過3倍。然而用記憶體的倍數來設定分頁檔其實意義不大,因為「設定了多大的分頁檔」並不等於「使用了多少分頁檔」。

舉個例子,如果分頁檔的大小是8GB,並不代表就一定會塞滿8GB的資料,但它還是會在硬碟上畫出1個8GB的檔案備用。至於要使用多少,完全由作業系統決定,使用者無法自行分配1個程序或所有程序在實體記憶體或分頁檔中的佔用比例。那麼,要怎麼判斷多少分頁檔才足夠?我們可以從程式們與作業系統佔用的記憶體總量來估算,它有個特殊的名稱,叫「Commit Memory」。

佔用量不等於使用量

應用程式剛執行時,會要求作業系統先保留(Reserve)一定的虛擬位址空間給它。保留的位址空間不代表立即可用,這麼做只是為了讓程式可以使用的連續位址最大化,等到空間真的挪出來後,程式便能夠佔用(Commit)它,不管佔用的分頁是位於實體記憶體或分頁檔裡。不過,「佔用」並不代表「已經使用」,佔用動作不一定會真正消耗掉分頁,而是作業系統保證一定能給應用程式使用的配額。

ADVERTISEMENT

打個比方。假設一群人在餐廳門口排隊等吃飯,帶頭的跟老闆說:「我們待會要坐10個連在一起的位置」。這時候餐廳裡未必會有10個相連的空位,服務生就要開始移動一些散客的座位,並且提醒這群新客人有空位就要先坐。等到真正移出10個座位時,他們可能全部只到了6個人,但是剩下的4個空位還是得暫時保留,一直等到太久還是沒人來、老闆決定要讓給別人坐為止。

由此可知,Commit Memory就是系統保證可以給應用程式佔用、但是應用程式不一定要馬上使用的空間。即使如此,還是必需要有足夠的空間才能讓程式Commit,因為只有10個位置就不可能讓20個人預約,不管最後會到的有幾個。

所以,直接看程式執行時的實體記憶體使用量是不準的,因為你只看到Commit空間的一部分,程式需要多少實體記憶體並不等於它目前只使用多少,它的需求總額要看Commit才行。我們可以將Commit值稱做「需求量」會更好理解。

ADVERTISEMENT

從工作管理員看佔用量

打開Windows工作管理員,我們可以找到記憶體使用情況的描述欄位,欄位裡的「認可」區塊會有2個數值,以分號區隔。左邊數字代表目前的Commit Memory使用量,右邊則是Commit Memory的上限:也就是實體記憶體加分頁檔的總容量。

如果使用更精準的工具:Process Explorer,那麼在左下角可以找到一個「Commit Charge」頁框,由上而下分別是「Current」、「Limit」以及「Peak」記憶體佔用量。它們可以用來描述以下情況:

  1. Limit就是實體記憶體加Pagefile.sys的極限可用大小。
  2. Current的數值是維持目前程式運作的記憶體總保留量。可能同時包含了實體記憶體或分頁檔裡的空間。
  3. 用最為簡化且不失籠統的說法來解釋,Peak是最嚴苛的記憶體使用情況,如果這峰值常出現,那麼你所需要的分頁檔大小加上實體記憶體得大於這個峰值。不想設分頁檔的話,那麼就是實體記憶體要大於這個峰值。

看懂工作管理員

打開Windows的工作管理員及資源監視器,只要懂加減法就能得知目前記憶體的使用情況。右圖及下圖為同台電腦,裝了2條8GB的記憶體,並且已關閉分頁檔。右圖中的已認可欄位就是commit值,8.9GB代表目前的記憶體需求量,15.7GB則是極限。「使用中」的5.8GB約等於系統佔用加程序Working Set的總和,如果再加上下圖已修改(Modified List)的753MB,就是右圖目前實體記憶體中的不可動範圍:41%,剩下的59%即為「可用的」9.3GB,零頭便忽略不計。                                

「已快取」減掉「已修改」剛好也會等於「可用的」(非「可用」)記憶體,因為Modified List也算是快取的一部分,但在它寫入硬碟之前並無法被取用。

Process Explorer

Process Explorer的記憶體頁框更精彩。而且在這裡也才能看到記憶體的巔峰需求量。左圖的觀察重點有幾個:Commit Charge、Physical Memory的Available以及Paging List。

Available代表在不關閉目前的程序及系統服務前提下所能使用的實體記憶體空間,如果沒有開啟分頁檔,這個數值就是Commit Charge裡的Limit減掉Current。Paging List則是透露了「快取的」及「可用的」記憶體的組成內容,我們可以看到Standby List是兩者最主要的組成元件,Free List則是趨近於0,因為還沒被抹除、又無法快取的分頁存在意義不大。至於Zeroed List的數值就是資源監視器裡的「可用」欄位,它只會意思性的維持小額容量,畢竟閒置分頁在記憶體壓力不大時拿來做快取比空著在一旁等有價值得多。

圖中還可以發現一個有趣的事實,使用中的記憶體加上快取幾乎就已經把所有實體記憶體佔滿了,由此可知要把16GB塞爆一點都不困難。如果你裝了64GB的記憶體,那麼要把整個系統碟都快取進來也不誇張,而且也比設置RAM Disk或RAMOS來得有意義,因為同樣都需要Hard Fault、效能相同,需要的實體記憶體量卻少了一半。

記憶體足夠就不需分頁檔

總結以上各項條件,我們可以歸納出最後結論:

ADVERTISEMENT

  1. 如果實體記憶體容量遠大於Commit Charge值,不設分頁檔是可嘗試的,這麼做也可以避免Windows進行不必要的Hard Faults。
  2. Commit Charge剛好、或差一點就能把實體記憶體用完,那麼交由系統自行管理分頁檔是最好的。一來可以分散浪費、二來也比較保險。
  3. 實體記憶體不夠,那就代表你該掏腰包了,請至少將其擴充到足夠Commit Charge使用。

在交由Windows自行管理的前提下,我們不必擔心分頁檔會太小,因為系統會自行依需求擴充其尺寸。但是當使用容量相對珍貴的SSD、又安裝了32或64GB的大記憶體時,就要手動縮減來節省磁碟空間了。

分頁檔不該放RAM Disk

行文至此,「該不該把分頁檔放入RAM Disk?」這種常被爭辯不休的問題也應該有個答案。

我們都知道RAM Disk一樣會耗用記憶體空間,而且大部分的RAM Disk都是在一開始就將指定的記憶體空間佔滿,工作集無法被縮減,即使RAM Disk裡完全沒資料也一樣。

ADVERTISEMENT

分頁檔是用來分散記憶體壓力的,劃出RAM Disk放置它等於是反其道而行,何況分頁檔的尺寸一開始就固定了,這麼做等於是「把記憶體拿來存放空白的分頁檔」,並且提早耗盡可用的實體記憶體,還不如完全不設分頁檔、讓實體記憶體能發揮最大的使用效率

別忘了,分頁檔裡的資料還是得讀回實體記憶體才能被程序存取,不必多此一舉。

(後面還有:倒吃甘蔗的快取策略)

ADVERTISEMENT

這裡可以買:http://www.chinesean.com/affiliate/clickBanner.do?wId=54967&pId=11857&cId=20045