2016-03-30 261 views
1

我試圖用C#監視另一個進程的內存。 但是,Process.WorkingSet64或Process.PrivateMemorySize64將輸出的最大內存值爲4294967295.我也遇到與性能計數器相同的問題。Process.WorkingSet64返回最大值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 

過程Tasklist命令輸出:

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內存測量已知的問題?

回答

2

您無法可靠地監控32位應用程序的64位進程,Wow64仿真程序編制的數字會阻止它們溢出UInt32.MaxValue。只需刪除抖動強制,以便您可以作爲64位進程運行。

項目>屬性>生成選項卡>平臺目標= AnyCPU,不佔用32位。

+1

我實際上只是把它建成了x64。這似乎是問題。 –

1

我沒有看到任何問題在您的代碼中,雖然我懷疑c#6.0功能和32位與64位屬性之間的一些非常不可思議的相互作用,PerformanceCounter上的NextValue()方法是一個float,所以沒辦法。

這使我相信問題不是.net,而不是代碼,而是系統中的某些東西,比如WMI。可能的相關信息:http://msdn.developer-works.com/article/13358955/Interesting+issue+with+ManagementEventWatcher+monitoring+registry+changes