过程存储器的大小不同的柜台
-
09-06-2019 - |
题
我试图找出多少存储器我自己的。网服务器进程正在使用(用于监控和记录的目的)。
我是使用:
Process.GetCurrentProcess().PrivateMemorySize64
然而,这一进程的对象有几种不同的性质,让我读存储空间用于:寻呼,非分页,PagedSystem,NonPagedSystem、私人、虚拟WorkingSet
然后的"高峰":我猜只储存的最大价值这些最后的曾经了。
通过阅读MSDN定义中的每一个酒店没有证明也有助于我。我不得不承认我的知识就是如何存管理(尽呼和虚拟变)是非常有限。
所以我的问题显然是"我应该使用哪一个?", 和我知道的答案是"它取决于"。
这个过程将基本上保持一堆名单内存在的事情是怎么回事,而其他进程与其通信和查询的东西。我期待的服务器这将运行,需要大量的RAM,所以我查询这个数据上的时间,以便能够估计RAM的要求相比较时,大小的名单,它让内部。
所以...我应该使用哪一个,为什么?
解决方案
如果你想知道有多少GC使用的尝试:
GC.GetTotalMemory(true)
如果你想知道你过程中使用的Windows(VM尺寸列在任务管理器)尝试:
Process.GetCurrentProcess().PrivateMemorySize64
如果你想知道你的过程已在RAM(而不是在页面文件)(存使用列在任务管理器)尝试:
Process.GetCurrentProcess().WorkingSet64
看看 在这里, 为更多的解释上的不同种类的存储器。
其他提示
好吧,我找到通过谷歌的同一页,拉尔斯提到的,我相信这是一个很好的解释的人不知道如何记忆工作(如我)。
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);
}
获得价值,任务经理让我的帽子是关于迈克*里根的解决方案上。然而,一项更改:它不是: perfCounter.NextValue()/1000;
但 perfCounter.NextValue()/1024;
(即一个真正的kb).这给确切价值的你看到任务主管机构。
以下是一个完整的解决方案显示的记忆使用'(任务经理的,如给定的)在一个简单的方式在你的WPF或它的应用程序(在这种情况下,只需在标题)。只需要调用这个方法在新的窗口构造:
private void DisplayMemoryUsageInTitleAsync()
{
origWindowTitle = this.Title; // set WinForms or WPF Window Title to field
BackgroundWorker wrkr = new BackgroundWorker();
wrkr.WorkerReportsProgress = true;
wrkr.DoWork += (object sender, DoWorkEventArgs e) => {
Process currProcess = Process.GetCurrentProcess();
PerformanceCounter perfCntr = new PerformanceCounter();
perfCntr.CategoryName = "Process";
perfCntr.CounterName = "Working Set - Private";
perfCntr.InstanceName = currProcess.ProcessName;
while (true)
{
int value = (int)perfCntr.NextValue() / 1024;
string privateMemoryStr = value.ToString("n0") + "KB [Private Bytes]";
wrkr.ReportProgress(0, privateMemoryStr);
Thread.Sleep(1000);
}
};
wrkr.ProgressChanged += (object sender, ProgressChangedEventArgs e) => {
string val = e.UserState as string;
if (!string.IsNullOrEmpty(val))
this.Title = string.Format(@"{0} ({1})", origWindowTitle, val);
};
wrkr.RunWorkerAsync();
}`
工作组不是一个很好的酒店使用。从我收集,包括一切的过程中可以触摸,甚至图书馆共同通过几个过程,所以你现在看到的双重计数字在那个计数器。私人记忆是一个更好的反来看待。
我建议还要监测如何经常页错误发生。一页错误发生,当你试图访问的一些数据已经从移动的物理存储器来交换文件和系统具有读取的网页,从磁盘之前,你可以访问该数据。
这是一个公正的描述吗?我想分享这与我的团队,所以,请让我知道如果它是错误的(或不完整的):
有几种方法在C#问有多少内存我的过程中使用。
- 分配的存储器可以管理(通过CLR)或管理。
- 分配的存储器可以是虚拟的(储存在磁盘上)或装(进入RAM页)
- 分配的存储器可以是私有的(只使用过程)或共享(例如属于一个DLL的其他进程正在引用).
鉴于以上所述,这里有一些方法来衡量存储器的使用在C#:
1)过程。VirtualMemorySize64():返回你所有的记忆使用的一个进程的管理或管理的虚拟或装载、私人或共用的。
2)的进程。PrivateMemorySize64():返回的所有私人使用的存储器的一个过程的管理或管理的虚拟或装载。
3)的过程。WorkingSet64():返回的所有私人的,载存储使用过的一个进程的管理或管理
4)GC。GetTotalMemory():返回的数量管理的内存在着垃圾的收集器。