如何计算任务管理器的内存使用情况?

好的,我使用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的内存。

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

在这里输入图像描述


Win32_PerfFormattedData_PerfProc_Process是正确的类。 它从WorkingSetPrivate提取的属性。 没有公式/计算需要。

链接地址: http://www.djcxy.com/p/80189.html

上一篇: How to calculate memory usage as Task Manager does?

下一篇: Virtual memory allocated to a process