如何像任务管理器那样计算内存使用量?
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
。无需公式/计算。
【讨论】:
以上是关于如何像任务管理器那样计算内存使用量?的主要内容,如果未能解决你的问题,请参考以下文章