我试图找出我自己的.Net服务器进程正在使用多少内存(用于监视和记录目的).
我正在使用:
Process.GetCurrentProcess().PrivateMemorySize64
但是,Process对象有几个不同的属性,让我可以读取使用的内存空间:Paged,NonPaged,PagedSystem,NonPagedSystem,Private,Virtual,WorkingSet
然后是"峰值":我猜测它只存储了最后一次所用的最大值.
阅读每个属性的MSDN定义对我来说并没有太大帮助.我不得不承认我对内存管理方式的了解(就分页和虚拟内容而言)非常有限.
所以我的问题显然是"我应该使用哪一个?",我知道答案是"它取决于".
这个过程基本上会在内存中保存一堆列表,而其他进程与它进行通信并查询它.我期望运行它的服务器需要大量的RAM,因此我会随着时间的推移查询这些数据,以便能够估计RAM要求与其保留的列表大小相比较.
那么......我应该使用哪一个?为什么?
如果您想知道GC使用了多少尝试:
GC.GetTotalMemory(true)
如果您想知道您的进程从Windows使用的内容(TaskManager中的VM Size列),请尝试:
Process.GetCurrentProcess().PrivateMemorySize64
如果你想知道你的进程在RAM中有什么(而不是在页面文件中)(TaskManager中的Mem Usage列),请尝试:
Process.GetCurrentProcess().WorkingSet64
有关不同类型的内存的更多说明,请参见此处.
好吧,我通过Google找到了Lars提到的同一页面,我相信这对于那些不太了解记忆效果的人来说是一个很好的解释(就像我一样).
http://shsc.info/WindowsMemoryManagement
我的简短结论是:
Private Bytes =我的进程请求存储数据的内存.其中一些可能会被分页到磁盘.这是我正在寻找的信息.
虚拟字节数=私有字节数,加上与加载的DLL等的其他进程共享的空间.
Working Set =我的进程的所有内存中未被分页到磁盘的部分.所以分页到磁盘的数量应该是(虚拟 - 工作集).
感谢你的帮助!
如果要使用Windows Vista任务管理器中显示的"内存(专用工作集)",它等同于Process Explorer"WS Private Bytes",则代码如下所示.可能最好将这个无限循环抛在一个线程/后台任务中,用于实时统计.
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); }