雖然是中文字,但是理解起來還是很困難,什么叫工作設置內存,什么叫內存專用工作集,什么叫提交大小,區別是什么,讓人看了一頭霧水.
通俗的講工作設置內存是程序占用的物理內存(包含與其他程序共享的一部分), 內存專用工作集是程序獨占的物理內存, 提交大小是程序獨占的內存(包含物理內存和在頁面文件中的內存).
注:頁面文件就是存放不在物理內存中的內存,文件路徑一般在C:\pagefile.sys,目的是為了能夠讓更多的進程運行,即使合起來所占用的內存已經超過物理內存. 只要將其中一部分內存轉入頁面文件, 物理內存就可以空出來繼續運行新的進程.
它們之間的關系:
工作設置內存 = 內存專用工作集 + 與其他進程共享的物理內存.
提交大小 = 內存專用工作集 + 保存在頁面文件中的獨占內存.
(其中有些例外,有時候內存專用工作集可能會比提交大小大一點點,不過可以不用考慮)
工作設置內存和內存專用工作集在程序不變化情況下會變化, 系統會考慮程序活動情況,物理內存剩余量等減少或增加物理內存.
提交大小在程序不變化情況下不會變化,因為程序就是占用了那么多專用內存.
如果要測試程序占用的內存大小,建議在程序加載完畢后記錄提交大小.其他的會變化建議不要記錄.
還想要了解更清楚?好孩子.
下面通過代碼來詳細了解.
首先windows任務管理器已經不夠用了,需要用Process explorer和VMMap工具.
接下來解釋一些名詞:
windows任務管理器中的稱謂 | Process explorer中的稱謂 | VMMap中的稱謂 |
工作設置內存 | Working set | Total WS |
內存專用工作集 | WS Private | Private WS |
提交大小 | Private Bytes | Private |
無對應選項可顯示 | Virtual Size | Size |
無對應選項可顯示 | 無對應選項可顯示 | Committed |
名詞說明:
Virtual Size: 程序總的所使用的內存(包含共享,非共享,物理,頁面,為程序保留的但未分配的內存)
Committed: Virtual Size減去為程序保留的但未分配的內存
為程序保留的但未分配的內存: 就是告訴系統我要一塊內存,但暫時不用,不過分配的地址得給我,系統就給他一個不用的地址,但不分配內存,等程序申請要使用時,就從頁面或物理內存中分配出來放在那個地址上.
關於頁面文件和物理內存如何轉換稍微講解一下,當程序要訪問某個地址, 系統發現這個地址不在物理內存里,就會產生中斷,然后去讀取頁面文件,把頁面文件中與內存相關的數據拷貝到物理內存,然后標記一下這個地址已經在物理內存中了,然后繼續讓程序運行.
現在來看個例子:
程序main.exe定義了一個5M的全局變量,5M的常量,並申請了一個5M的內存,程序代碼大小為2M.
char g_str[5*1024*1024]; const char STR[5*1024*1024]; void main() { char *p = (char*) HeapAlloc(GetProcessHeap(), 0, 1024*1024*5); call_lib(); }
程序lib.dll定義了一個4M的全局變量,4M的常量,並申請了一個4M的內存,程序代碼大小為1M.
char g_str[4*1024*1024]; const char STR[4*1024*1024]; void call_lib() { char *p = (char*) HeapAlloc(GetProcessHeap(), 0, 1024*1024*4); }
Main.exe程序調用了lib.dll
先看main.exe總的占用的內存.
Virtual Size = 5M的全局變量 + 5M的常量 + 5M的內存 + 2M的程序代碼
+ 4M的全局變量 + 4M的常量 + 4M的內存 + 1M的程序代碼
= 30M.
然后看main.exe獨占的內存:
Private Bytes = 5M的全局變量 + 5M的內存
+ 4M的常量 + 4M的內存
=18M.
由上可以看出獨占指的是只能進程自己使用, 比如代碼,常量等就是共享的.
分配的內存,可變的全局或靜態變量就是獨占的.
至於Working set和WS Private,因為其為變化量,所以無法計算其值.
Working set物理內存變化規律:
一般情況下在分配出來內存后,物理內存只分配4K左右,等訪問到超過4K的時候,會慢慢加大物理內存,等到系統總的物理內存小於一定值后,又會將不在前台的進程的物理內存減少.
如果進程想休息了, 可以調用SetProcessWorkingSetSize(GetCurrentProcess(), -1, -1);
來將自己的一些內存從物理內存轉移到頁面文件.
測試環境: Win7 32位
參考:
VMMAP顯示和process explorer不一樣
http://superuser.com/questions/185318/process-explorer-not-showing-the-biggest-user-of-my-ram
VMMap內存詳解
http://www.cnblogs.com/georgepei/archive/2012/03/07/2383548.html
作者:hgyxbll,原文鏈接: http://shashanzhao.com/archives/832.html