VC & 監(jiān)控進(jìn)程內(nèi)存使用情況 VC中使用GetProcessMemoryInfo函數(shù)得到的PROCESS_MEMORY_COUNTERS結(jié)構(gòu)體一直讓人很困惑, 尤其是將得到的值與任務(wù)管理器中顯示的值對(duì)比時(shí),更容易發(fā)現(xiàn)不吻合的情況。 以下例程中有PROCESS_MEMORY_COUNTERS結(jié)構(gòu)體各項(xiàng)與任務(wù)管理器中顯示的對(duì)應(yīng)關(guān)系。 - //ProcessMemory.cpp
-
- //用法:
- // argv[1]是子進(jìn)程的包含路徑的完整可執(zhí)行文件名
- // ProcessMemory notepad
-
- //編譯:
- // cl ProcessMemory.cpp
-
- //功能:
- // 獲取子進(jìn)程的內(nèi)存使用情況
-
-
- #include <stdio.h>
- #include <windows.h>
- #include <psapi.h>
- #pragma comment(lib, "psapi.lib")
-
- int main(int argc, char *argv[])
- {
- //CreateProcess的第一個(gè)參數(shù)
- STARTUPINFO StartupInfo = {0};
- StartupInfo.cb = sizeof(STARTUPINFO);
-
-
- //CreateProcess的第二個(gè)參數(shù)
- PROCESS_INFORMATION ProcessInfo = {0};
-
-
- CreateProcess(NULL, argv[1], NULL, NULL, TRUE, NULL, NULL, NULL, &StartupInfo, &ProcessInfo);
-
-
- //作用為:子進(jìn)程運(yùn)行結(jié)束后,查看它的內(nèi)存使用情況。
- // 此時(shí),所有非Peak的項(xiàng)均為0,所有Peak項(xiàng)顯示運(yùn)行期間的峰值
- //如果想在子進(jìn)程結(jié)束之前監(jiān)控它的內(nèi)存使用情況,可以將這句替換為
- // Sleep(1000);
- // 作用為:子進(jìn)程運(yùn)行1000毫秒之后,查看它的內(nèi)存使用情況
- WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
-
-
- PROCESS_MEMORY_COUNTERS pmc;
- GetProcessMemoryInfo(ProcessInfo.hProcess, &pmc, sizeof(pmc));
- //以下各項(xiàng)均以KB為單位
- //在任務(wù)管理器中顯示為:峰值工作設(shè)置(內(nèi)存)
- printf("%d\n", pmc.PeakWorkingSetSize/1024);
- //在任務(wù)管理器中顯示為:工作設(shè)置(內(nèi)存)
- printf("%d\n", pmc.WorkingSetSize/1024);
- printf("%d\n", pmc.QuotaPeakPagedPoolUsage/1024);
- //在任務(wù)管理器中顯示為:分頁(yè)池
- printf("%d\n", pmc.QuotaPagedPoolUsage/1024);
- printf("%d\n", pmc.QuotaPeakNonPagedPoolUsage/1024);
- //在任務(wù)管理器中顯示為:非頁(yè)面緩沖池
- printf("%d\n", pmc.QuotaNonPagedPoolUsage/1024);
- printf("%d\n", pmc.PeakPagefileUsage/1024);
- //在任務(wù)管理器中顯示為:內(nèi)存(專用工作集) //這是任務(wù)管理器的默認(rèn)顯示項(xiàng)!
- printf("%d\n", pmc.PagefileUsage/1024);
-
-
- return 0;
- }
|