我有以下代码来启动和监控进程:
Process process = new Process();
process.StartInfo.FileName = "foo.exe";
long maxMemoryUsage = 0;
process.Start()
while(!process.HasExited)
{
maxMemoryUsage = Math.Max(maxMemoryUsage, process.PrivateMemorySize64);
}
使用此代码运行一个大型应用程序后,根据任务管理器的说法,它在峰值时使用了 328 MB(内存“私有(private)工作集”)。 maxMemoryUsage 的值和 process.PeakPagedMemorySize64 的值是 364544。根据 MSDN 这个值应该解释为字节,这意味着它有点超过 300KB,与预期值相差 1000 倍。另一个 process.Peak...Memory 属性也报告了极低的值(都在 1 兆字节以下,除了 PeakVirtualMemorySize64,它是 4MB,我认为这是该字段的最小值)。
我尝试启动不同的应用程序(基于 C# 和 C++,我有源代码),我知道这些应用程序使用很少或很多内存,并且内存值总是非常接近此过程中看到的值。显然我在做一些完全错误的事情。
所以我的问题是:如何测量从 C# 应用程序生成的进程的最大内存使用量。 (请注意,只要我在程序退出后知道它的值,我就不需要它的值 ealtime,我也不需要它非常精确,因为我不在乎它是 27.04MB 还是 30MB,但是我请注意它是 30MB 还是 100MB)。
编辑:这是一个完整的可重现的测试用例
class Program
{
static void Main(string[] args)
{
Process process = new Process();
process.StartInfo.FileName = @"C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\devenv.exe";
long maxMemoryUsage = 0;
process.Start();
while(!process.HasExited)
{
maxMemoryUsage = Math.Max(maxMemoryUsage, process.PagedMemorySize64);
}
Console.Out.WriteLine("Memory used: " + (maxMemoryUsage / 1024.0) / 1024.0 + "MB");
Console.ReadLine();
}
}
根据任务管理器 Visual Studio 使用 103MB。关闭 Visual Studio 后,程序报告 0.3984375MB。
最佳答案
进程类被大量缓存。除非您调用 Refresh
方法,否则无论您读取某个属性多少次,您都只会获得缓存的结果。您需要调用 Process.Refresh 来获取非缓存结果。
从 msdn 引用
因此,您的代码将变为:
while(!process.HasExited)
{
process.Refresh();
maxMemoryUsage = Math.Max(maxMemoryUsage, process.PrivateMemorySize64);
}
您也可以考虑查看
process.PeakXXX
属性,我想这会对您有所帮助。关于c# - 测量进程内存使用量会给出极低(错误)的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25220202/