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
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 .
heres metoda używam:
http://www.codeproject.com/KB/dotnet/Memory_Leak_Detection.aspx
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.
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.
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!" :) –
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
W projekcie Code znajduje się obecnie łącze do aplikacji przeznaczonej specjalnie do wyszukiwania niedysponowanych obiektów.
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.
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ź. –
Wystarczająco fair, edytując odpowiedź, dołączając krótkie podsumowanie tego, co jest zawarte w artykule MSDN –
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
Oto kilka sztuczek z wykorzystaniem ANTS Memory Profiler pomóc znaleźć niezdyspergowanego obiekty i usunąć nieszczelności.
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.
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.
- 1. Problemy z pamięcią sterty
- 2. Problemy z pamięcią JVM
- 3. Problemy z zapytaniami SQL i pamięcią RAM
- 4. Jak rozwiązywać problemy z pamięcią w aplikacji wbudowanej?
- 5. Problemy z CMake i Visual C++ 2010
- 6. C# odpowiednik wektora C++ z przyległą pamięcią?
- 7. Problemy z pamięcią z dużą liczbą fragmentów w tylnym stosie
- 8. R statystyki - problemy z pamięcią podczas przydzielania dużej macierzy/Linux
- 9. Czy są problemy z pamięcią z oprogramowaniem Ext.js
- 10. węzeł debugowania js kolekcja śmieci/problemy z pamięcią z chromem
- 11. C++: o zarządzaniu pamięcią
- 12. Zarządzanie pamięcią C z blokami, ARC i nie-ARC
- 13. Objective-c: Problemy z blokami i NSEnumerationConcurrent
- 14. C++: Problemy z konstruktorem
- 15. Połączenie z pamięcią (R)
- 16. Bufory protokołów, uzyskanie C#, aby porozmawiać z C++: problemy typu i problemy z schematem
- 17. Problemy z dzieleniem w C#
- 18. Zarządzanie pamięcią C w gcc
- 19. C++ std :: enable_if warianty ograniczające i problemy
- 20. JavaFX - Ładowanie zdjęć i problemów z pamięcią
- 21. Zamieszanie z kodem i pamięcią CUDA PTX
- 22. Problemy z instalacją C# wdrożenia
- 23. Problemy z pętlą walidacji C++
- 24. Vim, C++, YCM i Syntastic obejmują problemy z ścieżkami
- 25. Obiekty z pamięcią dziedziczenia pamięci
- 26. Problem z pamięcią UIAutomation
- 27. Problem z pamięcią PHPExcel
- 28. Objective-C: Naprawianie zarządzania pamięcią w metodzie
- 29. C# - Jak znaleźć szerokość i długość geograficzną za pomocą C#
- 30. Problemy z łączeniem C# z EC2
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 –
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. –