windows任務管理器中的工作設置內存,內存專用工作集,提交大小詳解


雖然是中文字,但是理解起來還是很困難,什么叫工作設置內存,什么叫內存專用工作集,什么叫提交大小,區別是什么,讓人看了一頭霧水.

 

通俗的講工作設置內存是程序占用的物理內存(包含與其他程序共享的一部分), 內存專用工作集是程序獨占的物理內存, 提交大小是程序獨占的內存(包含物理內存和在頁面文件中的內存).

注:頁面文件就是存放不在物理內存中的內存,文件路徑一般在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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM