2012-03-20 13 views
13

Mam proces przechowywania 130 MB pamięci według Menedżera zadań, z tylko 11 MB żywych obiektów .NET zgodnie z dotTrace, więc zastanawiam się, co dzieje się z innymi 120MB?Narzędzia do analizy śladu pamięci natywnych bibliotek DLL i zespołów załadowanych w procesie?

Potrzebowałbym narzędzia do listy zestawów i natywnych bibliotek DLL załadowanych do procesu, pobrania rozmiaru obrazów w procesie, a dla każdego zespołu zmierzenie śladu pamięciowego metod JITed.

ListDlls z SysInternal wykonuje częściowo tę pracę. Ale nie mierzy rozmiaru kodu JITed i dostarcza tylko nieprzetworzonych danych. Idealnie chciałbym interfejsu użytkownika do analizy i podsumowania tych danych.

Niedawno zespół Visual Studio zgłosił, że wykonał taką analizę za pomocą narzędzia PerfView. Jest to określone w poście na blogu Visual Studio 11 Beta Performance Part #1, sekcja: Największy konsument VM - biblioteki DLL. Czy ktoś ma doświadczenie i opinie analizujące natywne ślady bibliotek Dll i złożeń za pomocą PerfView?

Z wyjątkiem ListDlls i PerfView, czy poleciłbyś inne narzędzie?


Ok, VMMAP poinformowani przez Simon MOURIER wydaje się być bardziej odpowiednie narzędzie do tego zadania. enter image description here VMMAP pokazuje, że większość pamięci zestawu roboczego przechodzi do Zarządzanego stosu (113 MB w kolorze zielonym poniżej), więc problem jest bardziej związany z obiektami .NET niż pamięć niezarządzana. Zielona krzywa zębów piły jest jedynie linią czasową sesji ładowania/rozładowywania. Z jakichś powodów, moje pierwsze środki były całkiem źle:

  • dotTrace mówi mi że mam 41MB .NET obiektów przydzielone
  • WMMAP przedstawia zestaw roboczy 180MB (menedżer zadań pokazuje podobną liczbę)
  • WMMAP pokazuje 113 MB zarządzanej sterty przydzielonej przez GC. 90MB to udało pamięci sterty jest w zestaw roboczy:

Więc mój plan:

  1. Zidentyfikuj dlaczego GC przydziela 113MB zarządzanej stercie do 41MB .NET obiektów? (czy takie liczby są normalne?) czy jest to spowodowane dużą fragmentacją?)
  2. Prace nad zmniejszeniem tego 41 MB zbioru obiektów .NET przydzielonych!

Odpowiedz

4

Odkąd wymieniłeś listęDysinSysinternals, istnieje inne narzędzie o nazwie Process Explorer, które ma mnóstwo informacji i jest o wiele lepsze niż ListDll (chcesz mieć pewność, że masz najnowsze wersje, które również mają dużo informacji .NET , obsługuje procesy 64-bitowe i 32-bitowe itd.).

Dla każdego procesu można wyświetlać jednocześnie pamięci niezarządzane (prywatne bajty i inne) oraz pamięć zarządzaną (zbiory GC, duże sterty obiektów itp.) Wyświetlane w kolumnach lub na proces.

Kolejne fajne narzędzie od sysinternals to VMMAP. Jest to narzędzie analizy pamięci procesowej i pokazuje podział różnych typów wirtualnych i fizycznych typów pamięci.

Jeśli chodzi o ciebie pytanie 120 MB, naprawdę chcesz sprawdzić wszystkie niezarządzane biblioteki DLL, które są wstrzykiwane w procesie i nie są częścią standardowej instalacji systemu Windows lub standardowego zestawu procesów DLL. W przypadku tak dużych przydziałów wielkości najpierw śledziłbym komponenty graficzne oczywiście, ponieważ są one znane z alokowania dużych porcji pamięci (szczególnie jeśli mówimy o narzędziu, takim jak NDepend, które jest graficzne). Process Explorer może również śledzić liczbę obiektów GDI i USER.

W temacie GDI dostępne jest bezpłatne narzędzie o nazwie GDIView, które zawiera szczegółowe informacje na temat obiektów GDI przydzielonych dla każdego procesu.

+0

Witaj, mój przyjacielu Simon, spróbuję VMMAP, ponieważ rzeczywiście w blogu VS11 wspominają o tym, ale wspominają też, że zrobili narzędzie powyżej VMMAP, aby wykorzystać jego wyniki. Spróbuję również GDIView, o którym nie wiedziałem! Dzięki –

+0

Dzięki Simonowi, VMMAP bardzo pomaga uzyskać pełny obraz. Moje dzisiejsze wyniki wydają się sugerować, że jest to bardziej problem z pamięcią GC/zarządzaną niż problem niezarządzany. Zobacz powyżej szczegóły. Czy jest jakiś pomysł, dlaczego GC ma 113 MB zarządzanej pamięci na 41 MB obiektów .NET? –

+0

@PatrickfromNDependteam - Jeśli jest zarządzany, powinieneś zanurkować w usłudze SOS (http://msdn.microsoft.com/en-us/library/bb190764.aspx) przy użyciu Windbg lub Visual Studio (http://blogs.msdn.com /b/vancem/archive/2006/03/07/545596.aspx) i użyj znanego polecenia * objsize *. Zrzuci między innymi listę obiektów .NET. Process Explorer (najnowsze wersje) może wyświetlać statystyki GC. Prawdopodobnie chcesz również rzucić okiem na stertę dużych obiektów lub LOH (http://msdn.microsoft.com/en-us/magazine/cc534993.aspx), który jest bardzo specjalną stertą (nie można go zagęszczać) –

0

Polecam SciTech .NET Memory Profiler. Narzędzie ma na celu przede wszystkim profilowanie wykorzystania pamięci .NET, na przykład odnajdywanie wycieków pamięci .NET lub identyfikowanie stref o dużym obciążeniu pamięci. Chociaż nie jest to jego główne użycie, ma również prostsze wyświetlanie pamięci rodzimej, w tym rozmiar kodu JIT na załadowaną bibliotekę. Jestem pewien, że z tego rodzaju informacji dowiesz się, skąd pochodzą te 120 MB.

+0

Właśnie wypróbowałem wersję SciTech .NET Memory Profiler w wersji 4, ale niestety z tym narzędziem wchodzi w grę część pamięci niezarządzanej: Pamięć fizyczna> Prywatna> Kod (13,3 MB)> (13 MB) i Pamięć fizyczna> Prywatna> Niezidentyfikowane hałdy niezarządzane (130 MB)> dane (121 MB) –

+0

Przy okazji ustawiam poziom profilowania na wysoki, aby uzyskać te wyniki, ale przypuszczam, że poziom profilowania jest bardziej związany z obiektami zarządzanymi niż z obiektami niezarządzanymi. –

0

Dla tych problemów używam RedGate ANTS .NET Developer Bundle. Memory Profiler pozwala zidentyfikować wycieki pamięci (np. Obiekty zombie) i zrobić migawki użycia pamięci. Będziesz wtedy mógł porównać klasy i instancje między dwoma migawkami. Możesz wyśledzić odniesienie do instancji w drzewie i łatwo wyświetlić najwyższy obiekt, który utrzymuje odniesienie.

Poza tym Performance Profiler oferuje profilowanie kodu w celu zidentyfikowania wąskich gardeł i użycia procesora.

Od lat pomogło nam znaleźć problemy z aplikacją w ciągu kilku minut.

+0

Uwielbiam RedGate ANTS .NET Memory Profiler, ale obecna wersja nie ma żadnej możliwości analizy niezarządzanego 120 MB mojego procesu. –

+0

6.0: http://www.red-gate.com/supportcenter/content/ANTS_Memory_Profiler/help/6.0/amp_unmanaged_leaks. 7.0: http://www.red-gate.com/supportcenter/Content?p=ANTS%20Memory%20Profiler&c=ANTS_Memory_Profiler/help/7.0/amp_unmanaged_use.htm&toc=ANTS_Memory_Profiler/help/7.0/toc1286226.htm. Nie mam tu 7.0, ale powinienem pomóc trochę, nawet jeśli nie wiem, które informacje są dostępne dla niezarządzanej pamięci. – JoeBilly

+0

6.0 poprawne łącze: http://www.red-gate.com/supportcenter/content/ANTS_Memory_Profiler/help/6.0/amp_unmanaged_leaks. Rzeczywiście dostarczone informacje wydają się niejasne dla wersji 7.0. – JoeBilly

Powiązane problemy