18

Chcę sprawdzić problem z wyciekiem pamięci w mojej usłudze. Próbowałem podążać za zestawem liczników perfmon.Liczniki Perfmon do sprawdzania wycieku pamięci

  1. .NET CLR Memory \ # bajtów we wszystkich Stosy
  2. .NET CLR Pamięć \ Gen 2 Heap Size
  3. .NET CLR Memory \ # GC uchwyty
  4. .NET CLR Memory \ # z przypięte Przedmioty
  5. .NET CLR Memory \ # Total zobowiązał Bytes
  6. .NET CLR Memory \ # całkowitą zastrzeżone Bytes
  7. .NET CLR Memory \ rozmiar Heap Large Object

mam, o których mowa powyżej zestawie z here

mowa również następujący zestaw:

  1. pamięci/dostępnych bajtów
  2. pamięci/Committed Bytes
  3. Proces/Private Bytes
  4. Proces/strona Plik Bajty
  5. Liczba procesów/uchwytów

mam, o których mowa powyżej zestawie z here

Czy istnieje jakikolwiek parametr/lub jakiekolwiek inne kryteria najlepszym sposobem identyfikacji licznik Perfmon do wycieku pamięci?
Czy ktoś może zaproponować mi zestaw liczników do sprawdzania wycieku pamięci? Lub powyżej zestawy obejmuje wyciek pamięci?

+0

Oto dobry artykuł http://www.codeproject.com/Articles/42721/Best-Practices-No-Detecting-NET-application-memo – CharithJ

Odpowiedz

26

Aby wykryć przeciek pamięci przy użyciu monitora wydajności, monitorowanie tych liczników:

  1. Pamięć/Dostępne licznik Bajty pozwala wyświetlić całkowitą liczbę bajtów dostępną pamięcią. Ta wartość zwykle waha się, ale jeśli masz aplikację z wyciekiem pamięci, zmniejszy się ona ponad czasu.
  2. Licznik pamięci/zatwierdzonych bajtów będzie stale rosnąć, jeśli wystąpi wyciek pamięci, ponieważ wraz ze zmniejszaniem się liczby dostępnych bajtów pamięci zwiększa się liczba zatwierdzonych bajtów.
  3. Licznik Process/Private Bytes wyświetla liczbę bajtów zarezerwowaną wyłącznie dla określonego procesu. Jeśli wystąpi wyciek pamięci o wartości , wartość ta będzie stale rosnąć.
  4. Licznik Bajty pliku/strony wyświetla rozmiar pliku stronicowania. System Windows używa pamięci wirtualnej (pliku stronicowania), aby uzupełnić pamięć fizyczną urządzenia o numerze . Kiedy fizyczna pamięć maszyny zaczyna się wypełniać, strony pamięci są przenoszone do pliku stronicowania. To normalne, że plik stronicowania może być używany nawet na maszynach z dużą ilością pamięci. Ale jeśli rozmiar pliku stronicowania stale rośnie, jest to dobry znak, że wystąpił wyciek pamięci w postaci .
  5. Chcę również wspomnieć o liczniku Proces/Rączka. Aplikacje używają uchwytów do identyfikowania zasobów, do których muszą uzyskać dostęp w trybie .Jeśli wystąpi wyciek pamięci, aplikacja często będzie tworzyć dodatkowe uchwyty do identyfikowania zasobów pamięci. Wzrost liczby uchwytów może oznaczać wyciek pamięci. Jednak nie wszystkie wycieki pamięci będą skutkować wzrostem liczby uchwytów.

Source

Z mojego doświadczenia jest to dokładne.

Odsyłam również do tego blogu Microsoft Advanced Debugging autorstwa Tess, pracownika firmy Microsoft. Kto sugeruje następujące liczniki. Stwierdziłem, że powyższe jest wystarczające, aby wskazać na wyciek pamięci, ale ufam, że instrukcje Tess mogłyby dostarczyć głębszego wglądu w tę kwestię.

Debugging Demos - Memory Review

  • .NET CLR Memory/# Bytes we wszystkich Stosy
  • .NET CLR Memory/Large Object Heap Size
  • .NET CLR Memory/Gen wielkość 2 sterty
  • .NET CLR Memory/Gen 1 rozmiar sterty
  • .NET CLR Memory/Gen 0 sterty rozmiar
  • Proces/Private Bytes
  • Process/Virtual Bajty
+0

Sprawdzanie niektóre procesy prywatnych bajtów i Bajty pliku stron, są dokładnie takie same (mimo że istnieje kilka GB wolnej pamięci fizycznej). Czy to naprawdę oznacza, że ​​cała pamięć procesu pochodzi z pliku stronicowania, a nie z pamięci fizycznej, czy też znaczenie Bajtów na Plik Strony jest bardziej zniuansowane? – stijn

3

Są lepsze narzędzia dostępne do testowania pamięci przecieki łatwiej takich jak RedGate ANTS Memory Profiler i JetBrains dotMemory Profiler.

Jeśli jednak chcesz używać liczników wydajności, this article wyjaśnia, jak używać liczników wydajności do testowania wycieków pamięci.

Należy pamiętać, że Garbage Collection nie zwalnia pamięci natychmiast po usunięciu pewnej instancji. Został zoptymalizowany do wyzwalania i zwalniania pamięci tylko wtedy, gdy występuje stres związany z pamięcią. Tak więc, jeśli chcesz przetestować pod kątem przecieków pamięci, wykonaj ręczne pobieranie pamięci zanim zaczniesz odczyty liczników.

GC.Collect(); 
GC.WaitForPendingFinalizers(); 

enter image description here

Powiązane problemy