如何像任务管理器那样计算内存使用量?

时间:2015-04-01 13:16:36

标签: .net windows memory memory-management wmi

好的,我正在使用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。

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

enter image description here

1 个答案:

答案 0 :(得分:5)

Win32_PerfFormattedData_PerfProc_Process是正确的类。它所取得的财产是WorkingSetPrivate。不需要公式/计算。