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. // 峰值虛擬記憶體使用