我有以下代码来启动和监控进程:

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/

10-11 02:55
查看更多