1. 程式人生 > >Windows程序記憶體計算

Windows程序記憶體計算

當開啟Windows工作管理員時,就會看到每個程序使用記憶體的分佈情況,往往會發現有一些程序佔用大量的記憶體,這種情況也是一種異常情況,可以作為是否惡意軟體的標誌之一。下面就來使用API函式GetProcessMemoryInfo來獲取記憶體的使用情況。

函式GetProcessMemoryInfo宣告如下:

BOOL WINAPI GetProcessMemoryInfo (

HANDLE Process,

PPROCESS_MEMORY_COUNTERS ppsmemCounters,

DWORD cb

);

Process是獲取記憶體使用情況的程序控制代碼。

ppsmemCounters

是返回記憶體使用情況的結構。

cb是結構的大小。

使用函式GetProcessMemoryInfo獲取程式當前記憶體使用量的步驟如下:

1.在程式中新增pragma comment(lib,"Psapi.lib"),將Psapi.lib包含進去,或者通過在工程屬性中新增Psapi.lib

2.在系統中包含Psapi.h檔案;

3.在需要檢視記憶體的程式碼處新增如下程式碼:

HANDLE handle = GetCurrentProcess();

PROCESS_MEMORY_COUNTERS pmc;

GetProcessMemoryInfo(handle,&pmc, sizeof(pmc));

printf("%d\r\n",pmc.WorkingSetSize);

其中pmc.WorkingSetSize就是程式在當前程式碼處的記憶體使用量。

另外,handle也可用下面物件代替,

DWORD dwprcess;

HANDLE hprocess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VN_READ, FALSE,dwprocess);

Function: Contains the memory statistics for aprocess.

Syntax:

typedef struct _PROCESS_MEMORY_COUNTERS {

DWORD cb;

DWORD PageFaultCount;

SIZE_T PeakWorkingSetSize;

SIZE_T WorkingSetSize;

SIZE_T QuotaPeakPagedPoolUsage;

SIZE_T QuotaPagedPoolUsage;

SIZE_T QuotaPeakNonPagedPoolUsage;

SIZE_T QuotaNonPagedPoolUsage;

SIZE_T PagefileUsage;

SIZE_T PeakPagefileUsage;

} PROCESS_MEMORY_COUNTERS, *PPROCESS_MEMORY_COUNTERS;

cb -- Size of the structure, in bytes.

PageFaultCount -- Number of page faults. 

PeakWorkingSetSize -- Peak working set size, in bytes. // 峰值記憶體使用

WorkingSetSize -- Current working set size, inbytes.  // 記憶體使用

QuotaPeakPagedPoolUsage -- Peak paged pool usage, in bytes.

QuotaPagedPoolUsage -- Current paged pool usage, inbytes.

QuotaPeakNonPagedPoolUsage -- Peak nonpaged pool usage, inbytes.

QuotaNonPagedPoolUsage -- Current nonpaged pool usage, inbytes.

PagefileUsage -- Current space allocated for thepagefile, in bytes.Those pages may or may not be in memory. // 虛擬記憶體使用

PeakPagefileUsage -- Peak space allocated for thepagefile, in bytes. // 峰值虛擬記憶體使用