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

标签 .net windows memory memory-management wmi

好的,所以我正在使用 WMI (.net/C#) 不断收集有关机器上运行的特定进程的数据。我通过Win32_PerfFormattedData_PerfProc_Process获取数据类(class)。该类有很多属性,但我们感兴趣的属性如下:

  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。

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

enter image description here

最佳答案

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

关于.net - 如何像任务管理器那样计算内存使用量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29391872/

相关文章:

c# - RadGrid 双击

.net - 如何编写验收测试

windows - 使用事件在 Windows 中观看、设置和获取事件语言

r - `lm` 是否由于 `model` 以外的原因返回 `predict`

c# - 使用 DateTime.TryParse 检查字符串是否为有效日期

c++ - Visual C++ 监控访问网站的最佳方式?

windows - 如何从 ruby​​ 将原始打印机代码写入 Windows 打印机共享?

windows - 在 Windows 上,WSASend 失败并显示 WSAENOBUFS

memory - 在现有的大量代码中使用 jemalloc

python - pandas read_csv 中最大化速度的最佳 block 大小是多少?