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

前端之家收集整理的这篇文章主要介绍了.net – 如何计算任务管理器的内存使用情况?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
好的,所以我使用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.不需要公式/计算.

猜你在找的Windows相关文章