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

Posted

技术标签:

【中文标题】如何像任务管理器那样计算内存使用量?【英文标题】:How to calculate memory usage as Task Manager does? 【发布时间】:2015-06-06 03:55:55 【问题描述】:

好的,我正在使用 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 字段来报告进程的内存使用情况。但是,这与 Task Manger 显示的内容不一致。我试过PrivateBytes,但这也不“正确”。应用程序监控的进程是一个 .NET 进程(如果这很重要的话),应用程序报告它使用的内存至少比任务管理器同时显示的内存多 100MB。

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

【问题讨论】:

【参考方案1】:

Win32_PerfFormattedData_PerfProc_Process 是正确的类。它提取的属性是WorkingSetPrivate。无需公式/计算。

【讨论】:

以上是关于如何像任务管理器那样计算内存使用量?的主要内容,如果未能解决你的问题,请参考以下文章

win7任务管理器 内存相关项目的解释

C# 怎么做一个像"任务管理器"那样的不用再次刷新就可以看见数据变化的功能?

任务管理器 各项参数是啥意思?!

iPhone中是不是有任务/应用程序管理器?

任务列表与任务管理器内存

ubuntu12.04如何打开像任务管理器一样的东西?见过,现在忘了