2009-07-24 13 views
6

Moja aplikacja używała 150 MB pamięci nie tak dawno temu, teraz ma 286 MB. Powoli się podnosi, więc muszę zapomnieć o czymś. Nie stanowi to dla mnie większego problemu, ponieważ mam 4 GB, ale chcę wysłać to innym, którzy mają tylko 1GB pamięci RAM. inne, a następnie przechodzenie przez linię kodu po linii, jak mogę znaleźć obiekty, które należy usunąć, lub po prostu duże obiekty?Jak znaleźć problemy z utylizacją i pamięcią? C#

Odpowiedz

2

Zapoznaj się z .NET Memory Profiler. Jest 15-dniowa wersja próbna i jest warta opłaty licencyjnej.

łatwo zidentyfikować przecieki pamięci przez zbierania i porównywania migawek Migawki NET pamięci zawierają dane o przykład alokacji NET i żywych przypadkach w czasie zrzutu zebrane. Dostarczają one wielu użytecznych informacji i ułatwiają identyfikację potencjalnych wycieków pamięci, szczególnie w przypadku porównania dwóch migawek .

1

Można również użyć WinDbg i SOS. Mają tę zaletę, że są wolni i bardzo, bardzo dokładni, jeśli są nieco trudni do przyzwyczajenia.

Oto opis procesu opisujący blog post.

+2

windbg i SOS są również moją ulubioną. Istnieje znacznie starszy wpis na blogu od Rico Mariani: http://blogs.msdn.com/ricom/archive/2004/12/10/279612.aspx –

+0

To był post, który wpakował mnie w SOS na początku ... Ale ten, który napisałem, wydaje mi się łatwiejszy do naśladowania. –

4

Rozszerzanie odpowiedzi JP i Reeda.

Chciałem wyjaśnić trochę zamieszania. Jeśli zauważysz znaczny wzrost pamięci, najprawdopodobniej problem z wywołaniem nie będzie problemem. Pozbywanie się jest zwykle używane w celu zwolnienia zasobów niezarządzanych, takich jak uchwyty. Nie zajmują one dużo pamięci, ale są cenniejsze jako zasoby.

Zwiększenia pamięci są zazwyczaj powiązane z dużymi obiektami lub kolekcjami dostępnymi z zarządzanego obiektu, który jest bezpośrednio lub pośrednio ukorzeniony za pośrednictwem obiektu stosu lub silnego uchwytu GC. Jest to obszar, na którym prawdopodobnie będziesz chciał skupić swoje dochodzenie.

+0

Tak, to jest świetny punkt. Używam profilera pamięci, aby zrealizować takie rzeczy jak "o, ta kolekcja nie powinna być coraz większa na zawsze!" :) –

+2

Przyjrzyj się także wszystkim zasubskrybowanym wydarzeniom. Zdarzenie zawiera odniesienie do subskrybenta, a jeśli nigdy nie zrezygnujesz z subskrypcji, odwołanie to nigdy nie zostanie usunięte. – JulianR

0

Wyjazd this link

Stephen Toub trafia do wielkiego długości wyjaśnić różne techniki dla tej operacji, Oto kilka krótkich podkreśla z jego artykułu

  • Dodając finalizatora do celów debugowania, możesz wprowadzić sposób, aby dowiedzieć się, kiedy klasa nie została właściwie usunięta, jeśli finalizator nigdy nie zostanie wywołany, ty wiesz szer że wyrzucać nie nazwano

  • Aby uzyskać dodatkowe informacje na temat instancji, threadIds itp, aby pomóc w zawężenia których wystąpienie nie miało to umieszczonych wywoływany, tworzy klasę FinalizationDebgger których Twoja klasa będzie jednorazowy Przytrzymaj, co chciałoby się nazwać instancją klasy Dispose of FinalizationDebugger, gdy sama się z niej zbywa. Jeśli nie nazywa utylizować na instancji klasy wtedy, gdy Finalizer biegnie będzie wywołać finalizatora dla FinalizationDebgger przykład gdzie można dochodzić lub wyjątek, aby pomóc debugowania problemu,

  • przenieść wszystkie śledzenia powiązany kod do klasy bazowej, którą klasa jednorazowa byłaby dziedziczona z, co czyni kod znacznie czystszym. Takie podejście może, ale nie musi, zadziałać, gdy spalimy klasę podstawową i jeśli dziedziczysz już z innej bazy.

  • W ostatniej opcji wszystko jest obliczane na klasę statyczną, do której wywołują twoje instancje . FinalizationDebugger staje się klasą statyczną, która ujawnia trzy statyczne metody: Konstruktor, Usuwanie i Finalizator. Chodzi o to, aby wywołać te metody z odpowiedniego miejsca w klasie (dispose/finalize/constructor). Jest to minimalnie inwazyjny w twoim kodzie, ponieważ zwykle wymaga tylko trzech linii kodu. Wszystkie te metody są oznaczone atrybutem warunkowym, tak że będą one nazywane tylko przez klasę podczas kompilacji klasy w trybie DEBUG.

Stephen również wyjaśnia zalety i wady każdego z jego podejść. Rozwiązania przedstawiają różne opcje i trzeba je ocenić, aby ustalić, która z nich najlepiej pasuje do danej sytuacji. MUSI przeczytać IMHO

Mam nadzieję, że to pomoże.

+0

Trzeba wypełnić odpowiedź lepiej, aby uzyskać głosy. Samo wskazanie linku nie jest wystarczająco dobre, ponieważ jeśli link się pojawi, nie jest to już pomocna odpowiedź. –

+0

Wystarczająco fair, edytując odpowiedź, dołączając krótkie podsumowanie tego, co jest zawarte w artykule MSDN –

0

Wypróbuj także ANTS Memory Profiler. Jest 14-dniowy, w pełni funkcjonalny darmowy okres próbny i bardzo podoba mi się interfejs użytkownika.

Ujawnienie: teraz sponsorują Kod piskliwy, dlatego go wypróbowałem. Ale jestem pod wielkim wrażeniem - profilowałem aplikację przez 30 godzin i otrzymałem z niej mnóstwo użytecznych informacji. Interfejs użytkownika jest naprawdę pomocny - prowadzi użytkownika przez cały proces i wygląda na czysty.

alt text http://www.red-gate.com/products/ants_memory_profiler/images/object_retention_graph.gif

0

Oto kilka sztuczek z wykorzystaniem ANTS Memory Profiler pomóc znaleźć niezdyspergowanego obiekty i usunąć nieszczelności.

  1. mrówek profilera Memory pozwala filtr do ustawienia, które pokazują tylko obiektów, które zawierają metodę Dispose(). Włącz tę opcję, a otrzymasz listę obiektów na żywo, które nie zostały usunięte.

  2. Podczas szukania obiektów nieużywanych jest przydatna, jeszcze bardziej przydatna jest wiedząc, dlaczego te obiekty nie są usuwane. Znalezienie miejsca, w którym te niepodzielone obiekty są tworzone, stanowi długą drogę do znalezienia przyczyny wycieku. Jeśli jesteś w stanie zmienić kod przeciekającego obiektu, użyteczną sztuczką jest wprowadzenie pola do przechowywania stosu, a zapełni to pole w czasie budowy obiektu. Dzięki temu profiler pamięci ANTS pozwala na inspekcję pól obiektów, , po prostu odczytujesz ślad stosu, tak jak to było w czasie, gdy zostały utworzone przeciekające obiekty. Da ci to silną wskazówkę, kto powinien być właścicielem przeciekających obiektów i jak powinny one wykonywać połączenia. Pozbądź się przedmiotów, za które są odpowiedzialne.

Powiązane problemy