当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《进程内存大小-不同的计数器》经验,为你挑选了3个好方法。

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

我正在使用:

Process.GetCurrentProcess().PrivateMemorySize64

但是,Process对象有几个不同的属性,让我可以读取使用的内存空间:Paged,NonPaged,PagedSystem,NonPagedSystem,Private,Virtual,WorkingSet

然后是"峰值":我猜测它只存储了最后一次所用的最大值.

阅读每个属性的MSDN定义对我来说并没有太大帮助.我不得不承认我对内存管理方式的了解(就分页和虚拟内容而言)非常有限.

所以我的问题显然是"我应该使用哪一个?",我知道答案是"它取决于".

这个过程基本上会在内存中保存一堆列表,而其他进程与它进行通信并查询它.我期望运行它的服务器需要大量的RAM,因此我会随着时间的推移查询这些数据,以便能够估计RAM要求与其保留的列表大小相比较.

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



1> Lars Truijen..:

如果您想知道GC使用了多少尝试:

GC.GetTotalMemory(true)

如果您想知道您的进程从Windows使用的内容(TaskManager中的VM Size列),请尝试:

Process.GetCurrentProcess().PrivateMemorySize64

如果你想知道你的进程在RAM中有什么(而不是在页面文件中)(TaskManager中的Mem Usage列),请尝试:

Process.GetCurrentProcess().WorkingSet64

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



2> Daniel Magli..:

好吧,我通过Google找到了Lars提到的同一页面,我相信这对于那些不太了解记忆效果的人来说是一个很好的解释(就像我一样).

http://shsc.info/WindowsMemoryManagement

我的简短结论是:

Private Bytes =我的进程请求存储数据的内存.其中一些可能会被分页到磁盘.这是我正在寻找的信息.

虚拟字节数=私有字节数,加上与加载的DLL等的其他进程共享的空间.

Working Set =我的进程的所有内存中未被分页到磁盘的部分.所以分页到磁盘的数量应该是(虚拟 - 工作集).

感谢你的帮助!



3> Michael Rega..:

如果要使用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);
}

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有