2015-04-01 133 views
13

好的,我使用WMI(.net/C#)不断收集有关机器上运行的特定进程的数据。我通过Win32_PerfFormattedData_PerfProc_Process类获得数据。这类有很多的属性,但那些我们感兴趣的是如下:如何计算任务管理器的内存使用情况?

uint64 PageFileBytes; 

值,以字节为单位,这个过程已经在分页文件(S)使用。分页文件存储进程使用的未包含在其他文件中的内存页面。分页文件由所有进程共享,分页文件中缺少空间可阻止其他进程分配内存。

uint32 PoolNonpagedBytes; 

值,以字节为单位,在非分页池,系统存储器(由操作系统使用的物理存储器),选择那些不能被写入到磁盘的对象的区域,但必须只要保持在物理存储器中,因为它们被分配。 Win32_PerfFormattedData_PerfOS_Memory中的PoolNonpagedBytes与Win32_PerfFormattedData_PerfProc_Process中的PoolPagedBytes属性计算方式不同,因此它可能不等于Win32_PerfFormattedData_PerfProc_Process的所有实例的PoolPagedBytes总数。该属性仅显示最后一个观察值;这不是一个平均值。

uint32 PoolPagedBytes; 

值,以字节为单位,在分页池,当它们不被用于可写入磁盘的对象的系统存储器(由操作系统使用的物理存储器)的一个区域。 Win32_PerfFormattedData_PerfOS_Memory中的PoolNonpagedBytes属性的计算方式与Win32_PerfFormattedData_PerfProc_Process中的PoolPagedBytes属性不同,因此它可能不等于Win32_PerfFormattedData_PerfProc_Process的所有实例的PoolPagedBytes总数。该属性仅显示最后一个观察值;这不是一个平均值。

uint64 PrivateBytes; 

此进程分配的当前值(以字节为单位),不能与其他进程共享。

uint64 VirtualBytes; 

电流的大小,以字节为单位的虚拟地址空间,该方法是使用。使用虚拟地址空间不一定意味着相应使用磁盘或主内存页面。虚拟空间是有限的,通过使用太多,这个过程可能会限制其加载库的能力。

uint64 WorkingSet; 

该进程的工作集在任何时间点的最大数量(以字节为单位)。工作集是进程中线程最近触及的一组内存页面。如果计算机中的可用内存超过阈值,即使它们未被使用,页面也会留在进程的工作集中。当空闲内存低于阈值时,页面将从工作集中删除。如果需要它们,则在它们离开主存之前,它们被软件故障重新放入工作集。

我目前使用WorkingSet字段来报告进程的内存使用情况。但是,这与任务管理器显示的内容不一致。我尝试了PrivateBytes,但这也不是“正确的”。应用程序监视的进程是一个.NET进程(如果这很重要),并且应用程序报告它将使用至少比任务管理器同时显示的内存多100MB的内存。

所以问题是什么是“公式”来计算过程的内存使用情况的最佳近似值,如任务管理器所示?

enter image description here

回答

3

Win32_PerfFormattedData_PerfProc_Process是正确的类。它从中拉出的财产是WorkingSetPrivate。没有公式/计算需要。