进程内存大小-不同的计数器我试图找出我自己的.Net服务器进程正在使用多少内存(用于监视和日志记录目的)。我正在使用:Process.GetCurrentProcess().PrivateMemorySize64但是,Process对象有几个不同的属性,允许我读取使用的内存空间:Paged、NonPaged、PagedSystem、NonPagedSystem、Private、Virtual、WorkingSet,然后是“Peak”:我猜它只存储最后使用的最大值。阅读每个属性的MSDN定义对我帮助不大。我必须承认,我对如何管理内存(在分页和虚拟内容方面)的了解非常有限。所以我的问题显然是“我应该使用哪个?”,我知道答案是“视情况而定”。该进程基本上在内存中保留了一堆列表,而其他进程则与其通信并查询它。我预计它运行的服务器需要大量RAM,因此我会随着时间的推移查询此数据,以便能够估计RAM需求与其保留的列表的大小相比。那么...我应该使用哪一个?为什么?如果您想知道GC使用了多少,请尝试:GC.GetTotalMemory(true)想知道您的进程在RAM中有什么(而不是在页面文件中)(TaskManager中的MemUsage列),请尝试:Process.GetCurrentProcess().WorkingSet64有关不同类型内存的更多解释,请参见此处。如果要使用WindowsVista任务管理器中显示的“Memory(PrivateWorkingSet)”,相当于ProcessExplorer的“WSPrivateBytes”,代码如下。将这个无限循环放入线程/后台任务中以获得实时统计数据可能会更好。使用系统线程;使用系统诊断;//命名空间...类...方法ProcessthisProc=Process.GetCurrentProcess();PerformanceCounterPC=newPerformanceCounter();PC.CategoryName="进程";PC.CounterName="工作集-私有";PC.InstanceName=thisProc.ProcessName;while(true){StringprivMemory=(PC.NextValue()/1000).ToString()+"KB(私有字节)";//用字符串privMemory做一些事情Thread.Sleep(1000);好吧,我通过Google找到了Lars提到的同一页,我相信这对那些不太了解记忆效应的人(比如我)来说是一个很好的解释。http://shsc.info/WindowsMemoryManagement我的简短结论:感谢您的帮助!对于任务管理器给出的值,我赞同MikeRegan的解决方案。但是,有一个变化:它不是:perfCounter.NextValue()/1000;但是perfCounter.NextValue()/1024;(即真正的千字节)。这给出了您在任务管理器中看到的确切值。这是一个完整的解决方案,用于在WPF或WinForms应用程序(在本例中,仅在标题中)中以简单的方式显示“内存使用情况”(如给定的任务管理器)。只需要在新的窗口构造函数中调用这种方法:privatevoidDisplayMemoryUsageInTitleAsync(){origWindowTitle=this.Title;//将WinForms或WPF窗口标题设置为字段BackgroundWorkerwrkr=newBackgroundWorker();wrkr.WorkerReportsProgress=true;wrkr.DoWork+=(objectsender,DoWorkEventArgse)=>{ProcesscurrProcess=Process.GetCurrentProcess();性能计数器perfCntr=newPerformanceCounter();perfCntr.CategoryName="进程";perfCntr.CounterName="工作集-私有";perfCntr.InstanceName=currProcess.ProcessName;while(true){intvalue=(int)perfCntr.NextValue()/1024;stringprivateMemoryStr=value.ToString("n0")+"KB[PrivateBytes]";wrkr.ReportProgress(0,privateMemoryStr);线程.睡眠(1000);}};wrkr.ProgressChanged+=(objectsender,ProgressChangedEventArgse)=>{stringval=e.UserStateasstring;如果(!string.IsNullOrEmpty(val))this.Title=string.Format(@"{0}({1})",origWindowTitle,val);};wrkr.RunWorkerAsync();}`工作集不是一个好用的属性。据我所知,它包括进程可以触及的所有内容,甚至是多个进程共享的库,因此您会在该计数器中看到重复计算的字节。私有内存是一个更好的计数器。我还建议监控页面错误发生的频率。当您尝试访问一些已从物理内存移动到交换文件的数据时,会发生页面错误,并且系统必须先从磁盘读取该页面才能访问该数据。以上就是C#学习教程:进程内存大小-不同计数器共享的所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
