【发布时间】:2010-10-24 23:06:31
【问题描述】:
我在弄清楚如何准确获取进程的内存使用情况时遇到了一些麻烦。 (它当前消耗了多少内存,而不是保留了多少,或者它的最大值或最小值)
假设我有一个进程在后台运行,Java.exe,它允许使用 1024mb 的内存,我如何知道它当前使用了多少内存。
我自己开始这个过程,所以我可以访问 Process 对象,我想进一步澄清一下什么属性是适合我的。
【问题讨论】:
标签: c#
我在弄清楚如何准确获取进程的内存使用情况时遇到了一些麻烦。 (它当前消耗了多少内存,而不是保留了多少,或者它的最大值或最小值)
假设我有一个进程在后台运行,Java.exe,它允许使用 1024mb 的内存,我如何知道它当前使用了多少内存。
我自己开始这个过程,所以我可以访问 Process 对象,我想进一步澄清一下什么属性是适合我的。
【问题讨论】:
标签: c#
我在 msdn 上找到了这个,它正在工作
System.Diagnostics.Process proc = ...; // assign your process here :-)
int memsize = 0; // memsize in KB
PerformanceCounter PC = new PerformanceCounter();
PC.CategoryName = "Process";
PC.CounterName = "Working Set - Private";
PC.InstanceName = proc.ProcessName;
memsize = Convert.ToInt32(PC.NextValue()) / (int)(1024);
PC.Close();
PC.Dispose();
【讨论】:
如果您纯粹对物理内存感兴趣,您可能想要WorkingSet64,它给出“为相关进程分配的物理内存量”。了解此值不断波动,此调用为您提供的值可能不是最新的。您可能还对PeakWorkingSet64 感兴趣,它给出了“关联进程使用的最大物理内存量”。
【讨论】:
太好了,我希望它与任务管理器中描述的一样,并尝试了:
Process.PrivateMemorySize64
Process.PeakVirtualMemorySize64
Process.PeakPagedMemorySize
Process.PagedSystemMemorySize64
Process.PagedMemorySize64
Process.NonpagedSystemMemorySize64
Process.WorkingSet64
并且这些都不起作用,但性能计数器可以!
PerformanceCounter PC = new PerformanceCounter();
PC.CategoryName = "Process";
PC.CounterName = "Working Set - Private";
PC.InstanceName = "processNameHere";
memsize = Convert.ToInt32(PC.NextValue()) / (int)(1024);
PC.Close();
PC.Dispose();
非常感谢!
【讨论】:
Process.PrivateMemorySize64 之前,您是否致电Process.Refresh()?
Win32 GetSystemInfo function 也可以。
在这个Memory.dll项目的过程中,它实际上已成功用于字节数组扫描的实践: https://github.com/erfg12/memory.dll/blob/042db0cf75e4152a7adf1ea47e6f23f1ad763fb6/Memory/memory.cs#L1909
【讨论】: