进程内存大小-不同的计数器

时间:2020-03-05 18:44:05  来源:igfitidea点击:

我试图找出我自己的.Net服务器进程正在使用多少内存(用于监视和记录目的)。

我正在使用:

Process.GetCurrentProcess().PrivateMemorySize64

但是,Process对象具有几个不同的属性,这些属性使我可以读取所使用的内存空间:
分页,非分页,PagedSystem,NonPagedSystem,私有,虚拟,WorkingSet

然后是"峰值":我猜只是存储这些最后一次使用的最大值。

仔细阅读每个属性的MSDN定义对我来说并没有太大帮助。我不得不承认我对内存的管理知识(就分页和虚拟而言)非常有限。

因此,我的问题显然是"我应该使用哪个?",我知道答案是"取决于情况"。

此过程基本上将一堆列表保存在正在发生的事情的内存中,而其他进程则与之通信并查询其内容。我期望在其上运行的服务器需要大量RAM,因此,随着时间的推移,我将查询此数据,以便与保留在其中的列表大小相比能够估计RAM需求。

所以...我应该使用哪一个?为什么?

解决方案

回答

如果我们想知道GC使用多少,请尝试:

GC.GetTotalMemory(true)

如果要从Windows(TaskManager中的" VM Size"(VM大小)列)知道进程使用什么,请尝试:

Process.GetCurrentProcess().PrivateMemorySize64

如果我们想知道进程在RAM中的内容(而不是在页面文件中)(TaskManager中的"内存使用情况"列),请尝试:

Process.GetCurrentProcess().WorkingSet64

有关不同类型的内存的更多说明,请参见此处。

回答

工作集不是一个好属性。根据我的收集,它包括该进程可以触及的所有内容,甚至包括多个进程共享的库,因此我们会在该计数器中看到重复计数的字节。私有内存是一个更好的选择。

回答

好的,我在Google上找到了Lars提到的页面,我相信这对于那些不太了解内存工作原理的人(如我)是一个很好的解释。

http://shsc.info/WindowsMemoryManagement

我的简短结论是:

  • 专用字节=我的进程已请求存储数据的内存。其中一些可能已分页到磁盘,也可能未分页到磁盘。这是我一直在寻找的信息。
  • 虚拟字节=专用字节,再加上与其他进程共享的已加载DLL等的空间。
  • 工作集=我的进程的所有内存中尚未分页到磁盘的部分。因此,分页到磁盘的数量应为(虚拟-工作集)。

感谢你的帮助!

回答

我建议还监视页面错误的发生频率。当我们尝试访问一些已从物理内存移动到交换文件的数据时,就会发生页面错误,并且系统必须先从磁盘读取页面,然后才能访问此数据。

回答

如果要使用Windows Vista任务管理器中所示的"内存(专用工作集)"(相当于进程浏览器" WS专用字节"),请使用以下代码。最好将这个无限循环扔到线程/后台任务中以获取实时统计信息。

using System.Threading;
using System.Diagnostics;

//namespace...class...method

Process thisProc = Process.GetCurrentProcess();
PerformanceCounter PC = new PerformanceCounter();

PC.CategoryName = "Process";
PC.CounterName = "Working Set - Private";
PC.InstanceName = thisProc.ProcessName;

while (true)
{
 String privMemory = (PC.NextValue()/1000).ToString()+"KB (Private Bytes)";
 //Do something with string privMemory

 Thread.Sleep(1000);
}