2016-03-30 19 views
1

Başka bir işlemin belleğini C# ile izlemeye çalışıyorum. Ancak, Process.WorkingSet64 veya Process.PrivateMemorySize64'ün çıkacağı maksimum bellek değeri 4294967295'dir. Ayrıca Performans Sayaçları ile aynı sorunu yaşıyorum.Process.WorkingSet64, maksimum değeri 4294967295 döndürür

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 ile, Windows Server 2012 R2 Running:

İşte benim kod.

Çıktı:

C:\XXX\perfmon>perfmon.exe 15800 
ProcessName:XXX.Windows.Services 
WorkingSet64 PrivateMemorySize64  Ram PC 
4294967295  4294967295    4.294967E+09 
süreci için

Powershell çıkışı: işlemi için

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

Tasklist çıkışı: Gördüğünüz gibi

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# süreci Ancak 4294967295 durur powershell veya görev listesini kullanarak 4 GB'ın üzerindeki belleği ölçmeye devam ediyor.

Bu, kodumda bir sorun mu var veya C# /. Net ile bellek ölçümünde bilinen bir sorun mu?

cevap

2

32 bitlik bir uygulamadan 64 bitlik bir işlemi güvenilir bir şekilde izleyemezsiniz, U1nt32.MaxValue taşmalarını önlemek için Wow64 emülatörü tarafından rakamlar pişirilir. Sadece jitter forcing'i kaldırarak 64 bitlik bir işlem olarak çalıştırabilirsiniz.

Proje> Özellikler> Oluştur sekmesi> Platform hedefi = AnyCPU, untick 32-bit tercih et.

+1

Aslında emin olmak için x64 olarak geliştirdim. Bu sorun gibi görünüyor. –

1

Kodunuzda herhangi bir sorun görmüyorum ve C# 6.0 özellikleri ile 32bit ve 64bit özellikleri arasındaki çok küçük tuhaf etkileşimlerden şüphelenirken, PerformanceCounter'daki NextValue() yöntemi bir kayan nokta değil.

Bu sorunun bana ait olmadığını düşünmeme neden oluyor. Net ve kod değil, sisteminizde WMI gibi bir şey var. Mümkün İlgili: http://msdn.developer-works.com/article/13358955/Interesting+issue+with+ManagementEventWatcher+monitoring+registry+changes

İlgili konular