Process.WorkingSet64 returns 最大值为 4294967295

Process.WorkingSet64 returns max value of 4294967295

我正在尝试使用 C# 监视另一个进程的内存。 但是,Process.WorkingSet64 或 Process.PrivateMemorySize64 将输出的最大内存值为 4294967295。我也遇到了与性能计数器相同的问题。

这是我的代码:

using System;
using System.Diagnostics;

namespace perfmon
{
    class Program
    {
        static void Main(string[] args)
        {
            int pid;
            if (int.TryParse(args[0], out pid))
            {
                var p = Process.GetProcessById(pid);

                var ramCounter = new PerformanceCounter("Process", "Working Set", p.ProcessName);
                Console.WriteLine($"ProcessName:{p.ProcessName}");

                var ram = ramCounter.NextValue();
                p.Refresh();

                Console.WriteLine("WorkingSet64\tPrivateMemorySize64\tRam PC");
                Console.WriteLine($"{p.WorkingSet64}\t{p.PrivateMemorySize64}\t\t{ram}");
            }

        }
    }
}

运行 Windows Server 2012 R2 with .net 4.61。

输出:

C:\XXX\perfmon>perfmon.exe 15800
ProcessName:XXX.Windows.Services
WorkingSet64    PrivateMemorySize64     Ram PC
4294967295      4294967295              4.294967E+09

进程的 Powershell 输出:

PS C:\Users\xxx> get-process -id 15800 | select-object -property workingSet64
WorkingSet64
------------
5079859200

进程的任务列表输出:

C:\Users\xxx>tasklist /FI "PID eq 15800"

Image Name                     PID Session Name        Session#    Mem Usage
========================= ======== ================ =========== ============
XXX.Windows.Services         15800 Services                   0   5,031,424 K

如您所见,C# 进程在 4294967295 停止。但是使用 powershell 或 tasklist 继续测量内存超过 4 GB。

这是我的代码中的问题还是 C#/.net 内存测量的已知问题?

我在你的代码中没有发现任何问题,虽然我怀疑 c# 6.0 功能和 32 位与 64 位属性之间存在一些非常不可能的奇怪交互,但 PerformanceCounter 上的 NextValue() 方法是一个浮点数,所以不可能.

这让我相信问题不在于 .Net,也不在于代码,而在于您系统中的某些东西,例如 WMI。可能相关:http://msdn.developer-works.com/article/13358955/Interesting+issue+with+ManagementEventWatcher+monitoring+registry+changes

您无法从 32 位应用程序可靠地监视 64 位进程,Wow64 模拟器会处理数字以防止它们溢出 UInt32.MaxValue。只需删除抖动强制,这样您就可以 运行 作为 64 位进程。

项目 > 属性 > 构建选项卡 > 平台目标 = AnyCPU,取消勾选首选 32 位。