2012-02-22 14 views
14

Próbuję zmierzyć, w programie C#, użycie pamięci.Jak zmierzyć zużycie pamięci za pomocą C# (jak możemy zrobić w Javie)?

Chciałbym poznać C# równowartość tej funkcji Java:

ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getCommitted() 

które przedstawiają całkowitą pamięć przydzieloną na stercie. Potrzebuję tego, aby poznać całkowity rozmiar pamięci przydzielonej dla mojego programu C#.

Następnie w Javie można uzyskać używany pamięć:

ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getUsed() 

Obecnie używam to w C#, aby przyzwyczaić Pamięć:

Process_Memory = MyProcess.PrivateMemorySize64; 

Ale nie jestem całkowicie pewien, że jest to równowartość.

Więc w życiorysu w jaki sposób mogę uzyskać całkowite przydzielone miejsce dla mojej aplikacji C# i bieżącego użycia w czasie t?

EDIT:

Od odpowiedzi i dalsze badania mam określić następująco:

Obecny używanej pamięci

System.GC.GetTotalMemory(false); 

Podać numer bajtów currentl y przydzielone w zarządzanej pamięci. (http://msdn.microsoft.com/fr-fr/library/system.gc.gettotalmemory.aspx)

Metoda ta zwraca niską wartość i jestem pewien, że tak naprawdę nie jest to reprezentacja wszystkich pamięci użytkowej jak mogę dostać z getUsed() w Java. W java dla tej samej aplikacji używana pamięć zaczyna się od 5MB i przechodzi do 125MB max. Z C# otrzymuję od 1 do 5 MB przy pomocy powyższej metody.

Wydaje się, że:

MyProcess.PrivateMemorySize64; // return ~=25MB 

lub

MyProcess.WorkingSet64; //return ~=20MB 

Daj dokładniejsze wartości wszystkich pamięci użytkowej. Ale nie wiem, z którego powinienem skorzystać ...

Dla globalnego przydzielonej pamięci na this article sugeruje używać:

Process_MemoryEnd1 = MyProcess.VirtualMemorySize64; 

powrót zawsze taką samą wartość wzdłuż programowo, około 169MB, że wydaje się być sprawiedliwy w porównaniu do Javy: od 64 MB do 170 MB max

ja nadal poszukuje dokładnej odpowiedzi na wszystkie znalazłem jest bardzo niejasne i nie jestem bardzo obeznany z zarządzaniem pamięcią systemu Windows, nie jestem pewien do undertand docs znalazłem:/

Odpowiedz

9

Klasa statyczna GC zapewnia wszystkie tego rodzaju informacje.

Twój prawdopodobnie po GC.GetTotalMemory().

EDIT:

wierzę, że próby treningu twój ślad pamięci w oparciu o aktualnie zakorzenione obiektów. JEŻELI chcesz, aby całkowity rozmiar przydzielony dla procesu (tj. Zawierający wolny bufor), skorzystaj z klasy Process. np:

Process.GetCurrentProcess().WorkingSet64; 
+0

Tak wiem, że to jednak Podaj rzeczywisty rozmiar obiektów w sterowanej stercie, jest to niska wartość. Nie sądzę, że jest to reprezentatywne dla całej przydzielonej pamięci. –

+0

Następnie uważam, że wystarczy użyć wszystkich właściwości klasy "Process", jeśli chcesz mieć przydzieloną surową pamięć (tzn. Nie uwzględniając żadnej z zarządzanych funkcji GC). 'PagedMemorySize64',' PrivateMemorySize64', itp. – Tyson

+0

Dzięki, więc myślę, że jeśli chcę tylko całkowita pamięć przydzielona procesowi 'PrivateMemorySize64' może wystarczyć. Nie dostaję tego, co jest stronicowaną pamięcią ... –

13

Herezje jednym ze sposobów, za pomocą GC

public void Test() 
    { 
     long kbAtExecution = GC.GetTotalMemory(false)/1024; 

     // do stuff that uses memory here 

     long kbAfter1 = GC.GetTotalMemory(false)/1024; 
     long kbAfter2 = GC.GetTotalMemory(true)/1024; 

     Console.WriteLine(kbAtExecution + " Started with this kb."); 
     Console.WriteLine(kbAfter1 + " After the test."); 
     Console.WriteLine(kbAfter1 - kbAtExecution + " Amt. Added."); 
     Console.WriteLine(kbAfter2 + " Amt. After Collection"); 
     Console.WriteLine(kbAfter2 - kbAfter1 + " Amt. Collected by GC.");   
    } 

Lub alternatywnie używając System.Diagnostics.PerformanceCounter dostać zestawu roboczego informację:

PerformanceCounter performanceCounter = new PerformanceCounter(); 

performanceCounter.CategoryName = "Process"; 

performanceCounter.CounterName = "Working Set"; 

performanceCounter.InstanceName = Process.GetCurrentProcess().ProcessName; 

Console.WriteLine(((uint)performanceCounter.NextValue()/1024).ToString("N0")); 
+0

Dzięki za odpowiedź. Tak więc, jak mówi doc, 'GC.GetTotalMemory (false)' zwraca liczbę bajtów aktualnie przydzielonych w zarządzanej pamięci. Myślę, że może to być odpowiednik getUse() w java. Ale w jaki sposób przydzielam całą przestrzeń? Czy "System.Diagnostics.Process.GetCurrentProcess(). PrivateMemorySize64" reprezentują tę wartość? –

+1

To prawda, tak. –

+0

Dla drugiego rozwiązania podniósł "System.InvalidOperationException" –

Powiązane problemy