好的,我使用WMI(.net/C#)不断收集运行在机器上的特定进程的数据。我通过Win32_PerfFormattedData_PerfProc_Process类获取数据。该类有许多属性,但我们感兴趣的是以下几个:
uint64 PageFileBytes;
这个进程使用的分页文件字节数。分页文件存储进程使用的内存页面,这些页面未包含在其他文件中。分页文件由所有进程共享,分页文件空间不足可能会阻止其他进程分配内存。
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。
所以问题是什么是计算最佳近似进程内存使用情况的“公式”,如任务管理器所示?