我正在尝试使用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}");
            }

        }
    }
}


在带有.net 4.61的Windows Server 2012 R2上运行。

输出:

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的内存测量的已知问题?

最佳答案

您无法可靠地监视来自32位应用程序的64位进程,Wow64仿真器会编写数字以防止它们溢出UInt32.MaxValue。只需消除抖动强制,您就可以作为64位进程运行。

项目>属性>生成选项卡>平台目标= AnyCPU,取消选中首选32位。

10-07 20:41