PSAPI: Query Process Memory Usage
PSAPI提供了函数GetProcessMemoryInfo ()来取得一个Process当前的内存使用情况,函数原型如下:
BOOL WINAPI GetProcessMemoryInfo(HANDLE hProcess,
PPROCESS_MEMORY_COUNTERS ppmc,
DWORD cb);
cb:要设置为ppmc结构体的大小;
ppmc:指向PROCESS_MEMORY_COUNTERS,存储Process当前所使用的内存情况;
(也可以传入PPROCESS_MEMORY_COUNTERSEX类型)
了解PROCESS_MEMORY_COUNTERS结构体
该结构体定义如下:
typedef struct _PROCESS_MEMORY_COUNTERS {
DWORD cb; // 结构体大小
DWORD PageFaultCount; // 缺页计数
SIZE_T PeakWorkingSetSize; // in byte
SIZE_T WorkingSetSize;
SIZE_T QuotaPeakPagedPoolUsage;
SIZE_T QuotaPagedPoolUsage; // in byte
SIZE_T QuotaPeakNonPagedPoolUsage;
SIZE_T QuotaNonPagedPoolUsage; // in byte
SIZE_T PagefileUsage; // in byte
SIZE_T PeakPagefileUsage;
} PROCESS_MEMORY_COUNTERS,
*PPROCESS_MEMORY_COUNTERS;
1.了解Process Working Set
一个Process的Working Set就是该Process的Virtual Address中已经被Reference的内存页集合(也就是物理页面了),包含Shared和Private Data,Shared Data是包含了程序所执行的所有指令的页集合,包括所使用的DLL和系统DLL。
系统为Process设置默认的Working Set大小;每一个Process都具有Minimum Working Set和Maximum Working Set,Virtual Memory Manager保证为活动的Process保留内存大小不会少于Minimum Working Set,但不会超过Maximum Working Set。
Virtual Memory Manager在将Virtual Address转换为Physical Address时,如果Virtual Address没有被映射到Physical Address,会引起Page Fault,这将影响程序的性能,因此应该尽可能的保证Process的Working Set。
可以获取/设置一个Process的Minimum Working Set和Maximum Working Set,获取使用函数:GetProcessWorkingSetSize();函数原型如下:
BOOL WINAPI GetProcessWorkingSetSize(
HANDLE hProcess,
PSIZE_T lpMinimumWorkingSetSize,
PSIZE_T lpMaximumWorkingSetSize
);
使用该函数必须对Process有PROCESS_QUERY_INFORMATION权限
设置使用函数:SetProcessWorkingSetSize();函数原型如下:
BOOL WINAPI SetProcessWorkingSetSize(
HANDLE hProcess,
SIZE_T dwMinimumWorkingSetSize,
SIZE_T dwMaximumWorkingSetSize
);
使用该函数,必须对Process具有PROCESS_SET_QUOTA权限;
如果Minimum和Maximum都被设置为-1,这将临时的把该Process的Working Set设置为0,最终将使该Process被swap out of the Physical Memory。
但是要注意,Working Set是从Physical Memory中真实划分出来的,一个程序占用了多少的Working Set,就有对应大小的Physical Memory不能被其他程序使用。
如果一个程序使用太大的Working Set将会影响整个系统的性能。
2.了解Page File Usage
MSDN:The current space allocated for the page file, in bytes. Those pages may or may not be in memory
Page File Usage是系统从Paging File中分配给Process的内存大小,也就是为Process分配的虚拟内存大小了。(32位系统中,一个进程最多可以占用4G的虚拟空间)
内存泄漏通常会引起Working Set和Page File Usage的线性增长。
3.了解Paged Pool Usage和Non-Paged Pool Usage
我们知道Windows将虚拟空间分成了用户控件和内核空间两部分,其中用户空间总是可分页的,使用者:应用层程序;而内核空间,又分成了Paged Pool和Non-Paged Pool两部分,使用者:系统内核和内核态驱动程序。
Paged Pool,分页内存池,就是说在必要的时候,从Paged Pool分配的页面可以从物理内存中交换到硬盘上。
Non-Paged Pool,非分页内存池,从Non-Paged Pool中分配的页面将一直留在物理内存中,不能被换出。
因此Paged Pool Usage和Non-Paged Pool Usage分别显示了系统Paged Pool和Non-Paged Pool的使用情况。