好吧,我正在使用WMI(.net / C#)不断收集有关在机器上运行的特定进程的数据。 我通过Win32_PerfFormattedData_PerfProc_Process类获取数据。 这个类有很多属性,但我们感兴趣的是如下:
uint64 PageFileBytes;
值(以字节为单位)该进程在页面文件中使用的值。 分页文件存储进程使用的未包含在其他文件中的内存页面。 分页文件由所有进程共享,分页文件中缺less空间可阻止其他进程分配内存。
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
字段来报告进程的内存使用情况。 但是,这与任务pipe理器显示的内容不一致。 我尝试过使用PrivateBytes
但这也不是“正确的”。 应用程序监视的进程是一个.NET进程(如果这很重要),应用程序会报告它使用至less比任务pipe理器同时显示多100MB的内存。
所以问题是什么是“公式”来计算过程的内存使用情况的最佳近似,如任务pipe理器所示?
Win32_PerfFormattedData_PerfProc_Process
是正确的类。 它从属性WorkingSetPrivate
。 没有公式/计算需要。