PSAPI—Query Process Memory Usage

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

       一个ProcessWorking Set就是该ProcessVirtual Address中已经被Reference的内存页集合(也就是物理页面了),包含SharedPrivate DataShared Data是包含了程序所执行的所有指令的页集合,包括所使用的DLL和系统DLL

       系统为Process设置默认的Working Set大小;每一个Process都具有Minimum Working SetMaximum Working SetVirtual Memory Manager保证为活动的Process保留内存大小不会少于Minimum Working Set,但不会超过Maximum Working Set

       Virtual Memory Manager在将Virtual Address转换为Physical Address时,如果Virtual Address没有被映射到Physical Address,会引起Page Fault,这将影响程序的性能,因此应该尽可能的保证ProcessWorking Set

       可以获取/设置一个ProcessMinimum Working SetMaximum Working Set,获取使用函数:GetProcessWorkingSetSize();函数原型如下:

BOOL WINAPI GetProcessWorkingSetSize(

  HANDLE hProcess,

  PSIZE_T lpMinimumWorkingSetSize,

  PSIZE_T lpMaximumWorkingSetSize

);

使用该函数必须对ProcessPROCESS_QUERY_INFORMATION权限

 

设置使用函数:SetProcessWorkingSetSize();函数原型如下:

BOOL WINAPI SetProcessWorkingSetSize(
  HANDLE hProcess,
  SIZE_T dwMinimumWorkingSetSize,
  SIZE_T dwMaximumWorkingSetSize
);

使用该函数,必须对Process具有PROCESS_SET_QUOTA权限;

如果MinimumMaximum都被设置为-1,这将临时的把该ProcessWorking Set设置为0,最终将使该Processswap out of the Physical Memory

 

但是要注意,Working Set是从Physical Memory中真实划分出来的,一个程序占用了多少的Working Set,就有对应大小的Physical Memory不能被其他程序使用。

如果一个程序使用太大的Working Set将会影响整个系统的性能。

 

2.了解Page File Usage

MSDNThe 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 SetPage File Usage的线性增长。

 

3.了解Paged Pool UsageNon-Paged Pool Usage

我们知道Windows将虚拟空间分成了用户控件和内核空间两部分,其中用户空间总是可分页的,使用者:应用层程序;而内核空间,又分成了Paged PoolNon-Paged Pool两部分,使用者:系统内核和内核态驱动程序。

Paged Pool,分页内存池,就是说在必要的时候,从Paged Pool分配的页面可以从物理内存中交换到硬盘上。

Non-Paged Pool,非分页内存池,从Non-Paged Pool中分配的页面将一直留在物理内存中,不能被换出。

因此Paged Pool UsageNon-Paged Pool Usage分别显示了系统Paged PoolNon-Paged Pool的使用情况。

你可能感兴趣的:(manager,File,query,byte,reference,winapi)