Process.WorkingSet64返回最大值4294967295

时间:2016-03-30 00:10:12

标签: c# memory process monitoring system.diagnostics

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

这是我的代码:

(defun my-isearch-update-post-hook()
  (let (suffix num-before num-after num-total)
    (setq num-before (count-matches isearch-string (point-min) (point)))
    (setq num-after (count-matches isearch-string (point) (point-max)))
    (setq num-total (+ num-before num-after))
    (setq suffix (if (= num-total 0)
                     ""
                   (format " [%d of %d]" num-before num-total)))
    (setq isearch-message-suffix-add suffix)
    (isearch-message)))

(add-hook 'isearch-update-post-hook 'my-isearch-update-post-hook)

使用.net 4.61在Windows Server 2012 R2上运行。

输出:

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}");
            }

        }
    }
}

流程的Powershell输出:

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

进程的任务列表输出:

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

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

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

2 个答案:

答案 0 :(得分:4)

您无法从32位应用程序可靠地监视64位进程,Wow64仿真器会编号,以防止它们溢出UInt32.MaxValue。只需删除抖动强制,这样您也可以作为64位进程运行。

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

答案 1 :(得分:1)

我没有看到你的代码有任何问题,虽然我怀疑c#6.0特性与32bit和64bit属性之间有一些非常不可思议的奇怪交互,但PerformanceCounter上的NextValue()方法是一个浮点数,所以没办法。 / p>

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