通俗的講工作設置內存是程序占用的物理內存(包含與其他程序共享的一部分),?
內存專用工作集是程序獨占的物理內存,?
提交大小是程序獨占的內存(包含物理內存和在頁面文件中的內存).
注:頁面文件就是存放不在物理內存中的內存,文件路徑一般在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]; ?//5M的全局變量
const?char?STR[5*1024*1024]; ? //5M的常量
void?main()
{
char?*p?=?(char*)?HeapAlloc(GetProcessHeap(),?0,?1024*1024*5); ? //申請的5M內存
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