2009-05-09 12 views
17

Mam pewne problemy z ustaleniem, w jaki sposób uzyskuje się użycie procesora. (Ile pamięci aktualnie zużywa, ile nie jest zarezerwowana, czy maksimum czy min)Uzyskiwanie wykorzystania pamięci procesowej

Powiedzmy, że mam proces działający w tle, Java.exe, dozwolone jest użycie 1024 MB pamięci RAM, jak mogę powiedzieć, ile aktualnie używa ramka?

Sam rozpoczynam ten proces, więc mam dostęp do obiektu Process, chciałbym tylko trochę więcej wyjaśnienia, która właściwość jest dla mnie.

+0

Możliwy duplikat [Jak dostać udostępniane lub wykorzystywane w C# pamięć] (https://stackoverflow.com/questions/750574/how-to- get-memory-available-or-used-in-c-sharp) – Saul

Odpowiedz

16

Jeśli interesuje Cię pamięć fizyczna, prawdopodobnie potrzebujesz WorkingSet64, co daje "ilość pamięci fizycznej przydzielonej do powiązanego procesu". Zrozum, że wartość ta nieustannie waha się, a wartość tego połączenia może nie być aktualna. Możesz być także zainteresowany PeakWorkingSet64, który podaje "maksymalną ilość pamięci fizycznej używanej przez powiązany proces."

+4

Jednak uważaj na [zablokowane strony] (http://forum.sysinternals.com/topic23886_post122660.html), które nie są częścią zestawu roboczego (co dziwne), a [standardowy menedżer zadań też ich nie widzi] (http://blogs.msdn.com/b/psssql/archive/2009/09/11/fun-with-locked-pages-awe- task-manager-and-the-working-set.aspx) (chociaż są one z pewnością zużyte: D) –

+0

Chcę użyć PeakWorkingSet64, aby uzyskać maksymalną pamięć używaną przez proces, ale Nie wiem, kiedy uzyskać tę właściwość, aby uzyskać największą dokładność. Myślę, że najlepszą chwilą na zdobycie nieruchomości jest proces "OnExitting", ale klasa Process don ma to wydarzenie. To po prostu zakończone zdarzenie – Andiana

26

Znalazłem to na MSDN i pracuje

System.Diagnostics.Process proc = assign your process here :-) 

int memsize = 0; // memsize in Megabyte 
PerformanceCounter PC = new PerformanceCounter(); 
PC.CategoryName = "Process"; 
PC.CounterName = "Working Set - Private"; 
PC.InstanceName = proc.ProcessName; 
memsize = Convert.ToInt32(PC.NextValue())/(int)(1024); 
PC.Close(); 
PC.Dispose(); 
+1

to jest prawdziwa odpowiedź –

+1

Nie sądzę, że musisz rzucić liczbę całkowitą? – Codingale

+0

@Laz przetestowano, a zwrócona wartość jest najdokładniejsza w porównaniu z Menedżerem zadań. ale w przypadku niektórych procesów wielowątkowych, takich jak Google Chrome, nie można uzyskać dokładnych wyników, żadnych pomysłów? – Dennis

Powiązane problemy