Udostępnij za pośrednictwem


Mierzenie użycia pamięci w programie Visual Studio (C#, Visual Basic, C++, F#)

Znajdowanie przecieków pamięci i nieefektywnej pamięci podczas debugowania za pomocą narzędzia diagnostycznego zintegrowanego z debugerem użycie pamięci. Narzędzie Użycie pamięci umożliwia wykonanie jednej lub więcej migawek sterty zarządzanej i natywnej pamięci, aby ułatwić zrozumienie wpływu użycia pamięci przez typy obiektów. Możesz również analizować użycie pamięci bez dołączonego debugera lub celowania w działającą aplikację. Aby uzyskać więcej informacji, zobacz Uruchamianie narzędzi profilowania w kompilacjach wydania lub debugowania. Aby uzyskać informacje na temat wybierania najlepszego narzędzia do analizy pamięci dla Twoich potrzeb, zobacz Wybierz narzędzie do analizy pamięci.

Chociaż migawki pamięci można zbierać w dowolnym momencie w narzędziu użycie pamięci, możesz użyć debugera programu Visual Studio, aby kontrolować sposób wykonywania aplikacji podczas analizowania problemów z wydajnością. Ustawianie punktów przerwania, kroków, przerwania wszystkich i innych akcji debugera może pomóc w skoncentrowaniu badań wydajności na ścieżkach kodu, które są najbardziej istotne. Wykonanie tych akcji podczas działania aplikacji może wyeliminować szum z kodu, który cię nie interesuje i może znacznie skrócić czas potrzebny do zdiagnozowania problemu.

Ważny

Zintegrowane z debugerem narzędzia diagnostyczne są obsługiwane w przypadku programowania na platformie .NET w programie Visual Studio, w tym ASP.NET, ASP.NET Core, programowania natywnego/C++ oraz aplikacji trybu mieszanego (.NET i natywnego).

Nauczysz się:

  • Zrób migawki pamięci
  • Analizowanie danych użycia pamięci

Jeśli Memory Usage nie udostępnia potrzebnych danych, inne narzędzia profilujące w Performance Profiler dostarczają różnych rodzajów informacji, które mogą być dla Ciebie pomocne. W wielu przypadkach wąskie gardło wydajności aplikacji może być spowodowane przez coś innego niż pamięć, takie jak procesor CPU, renderowanie interfejsu użytkownika lub czas żądania sieciowego.

Notatka

niestandardowej obsługi alokatora Profiler pamięci natywnej działa, zbierając dane alokacji ETW zdarzenia emitowane w czasie wykonywania. Alokatory w zestawach CRT i Windows SDK zostały opatrzone adnotacjami na poziomie kodu źródłowego, co umożliwia przechwycenie danych dotyczących alokacji. Jeśli piszesz własne alokatory, każda funkcja, która zwraca wskaźnik do nowo przydzielonej pamięci na stercie, może być oznaczona przy użyciu __declspec(alokator), jak pokazano w tym przykładzie dla myMalloc:

__declspec(allocator) void* myMalloc(size_t size)

Zbieranie danych użycia pamięci

  1. Otwórz projekt, który chcesz debugować w programie Visual Studio, i ustaw punkt przerwania w aplikacji w punkcie, w którym chcesz rozpocząć badanie użycia pamięci.

    Jeśli masz obszar, w którym podejrzewasz problem z pamięcią, ustaw pierwszy punkt przerwania przed wystąpieniem problemu z pamięcią.

    Napiwek

    Ponieważ może to być trudne do przechwycenie profilu pamięci interesującej Cię operacji, gdy aplikacja często przydziela i zwalnia pamięć, ustaw punkty przerwania na początku i na końcu operacji (lub przeprowadzaj krokowo przez operację), aby znaleźć dokładny punkt, w którym zmieniła się pamięć.

  2. Ustaw drugi punkt przerwania na końcu funkcji lub regionu kodu, który chcesz przeanalizować (lub po wystąpieniu podejrzanego problemu z pamięcią).

  3. Okno narzędzi diagnostycznych pojawi się automatycznie, chyba że zostało wyłączone. Aby ponownie wyświetlić okno, kliknij pozycję Debuguj>Windows>Pokaż narzędzia diagnostyczne.

  4. Wybierz użycie pamięci, korzystając z ustawienia Wybierz narzędzia na pasku narzędzi.

    zrzut ekranu przedstawiający narzędzia diagnostyczne.

    zrzut ekranu przedstawiający narzędzia diagnostyczne.

  5. Kliknij pozycję Debugowanie/Rozpocznij debugowanie (lub Uruchom na pasku narzędzi lub F5).

    Po zakończeniu ładowania aplikacji zostanie wyświetlony widok Podsumowanie narzędzi diagnostycznych.

    zrzut ekranu przedstawiający kartę Podsumowanie narzędzi diagnostycznych.

    Uwaga

    Ponieważ zbieranie danych pamięci może mieć wpływ na wydajność debugowania aplikacji natywnych lub mieszanych, migawki pamięci są domyślnie wyłączone. Aby włączyć migawki w aplikacjach w trybie natywnym lub mieszanym, uruchom sesję debugowania (skrót klawiszowy: F5). Po wyświetleniu okna Narzędzia diagnostyczne wybierz kartę Użycie pamięci, a następnie wybierz Profilowanie sterty.

    Zrzut ekranu przedstawiający opcję

    Zatrzymaj (Klawisz skrótu: Shift+F5) i uruchom ponownie debugowanie.

    zrzut ekranu przedstawiający zakładkę Podsumowanie narzędzi diagnostycznych.

    Notatka

    Ponieważ zbieranie danych pamięci może mieć wpływ na wydajność debugowania aplikacji natywnych lub mieszanych, migawki pamięci są domyślnie wyłączone. Aby włączyć migawki w aplikacjach w trybie natywnym lub mieszanym, uruchom sesję debugowania (skrótu: F5). Po wyświetleniu okna narzędzia diagnostycznego wybierz kartę użycie pamięci, a następnie wybierz profilowanie sterty.

    Zrzut ekranu przedstawiający opcję

    Zatrzymaj (skrót klawiszowy: Shift+F5) i uruchom ponownie debugowanie.

  6. Aby utworzyć migawkę na początku sesji debugowania, wybierz pozycję Utwórz migawkę na pasku narzędzi podsumowania użycia pamięci . (Może to również pomóc w ustawieniu punktu przerwania).

    zrzut ekranu przedstawiający przycisk Zrób zrzut ekranu.

    zrzut ekranu przedstawiający przycisk Wykonaj migawkę.

    Napiwek

    Aby utworzyć punkt odniesienia dla porównań pamięci, rozważ utworzenie migawki na początku sesji debugowania.

  7. Uruchom scenariusz, który spowoduje uderzenie w pierwszy punkt przerwania.

  8. Podczas gdy debuger jest wstrzymany w pierwszym punkcie przerwania, wybierz pozycję Wykonaj migawkę na pasku narzędzi podsumowania Użycie pamięci.

  9. Naciśnij F5, aby uruchomić aplikację do momentu osiągnięcia drugiego punktu przerwania.

  10. Teraz wykonaj kolejną migawkę.

    W tym momencie możesz rozpocząć analizowanie danych.

    Jeśli masz problemy ze zbieraniem lub wyświetlaniem danych, zobacz Rozwiązywanie błędów profilowania i naprawianie problemów.

Analizowanie danych użycia pamięci

Wiersze tabeli podsumowania Użycia pamięci zawierają listę migawek wykonanych podczas sesji debugowania oraz udostępniają linki do bardziej szczegółowych widoków.

zrzut ekranu przedstawiający tabelę Użycie pamięci.

zrzut ekranu przedstawiający tabelę Użycie pamięci.

Nazwa kolumny zależy od trybu debugowania wybranego we właściwościach projektu: .NET, native lub mieszanych (zarówno .NET, jak i native).

  • Kolumna Objects (Diff) (.NET) lub Allocations (Diff) (C++) wyświetla liczbę obiektów w pamięci .NET lub natywnej w momencie wykonania migawki.

  • W kolumnie Rozmiar sterty (różnica) wyświetlana jest liczba bajtów w stertach .NET i natywnych.

Po utworzeniu wielu migawek komórki tabeli podsumowania zawierają zmianę wartości między migawką wiersza a poprzednią migawką.

Aby przeanalizować użycie pamięci, kliknij jeden z linków, który otwiera szczegółowy raport użycia pamięci:

  • Aby wyświetlić szczegóły różnicy między bieżącą migawką a poprzednią migawką, wybierz link zmiany z lewej strony strzałki (Zwiększenie użycia pamięci). Czerwona strzałka wskazuje wzrost użycia pamięci, a zielona strzałka wskazuje spadek.

Napiwek

Aby szybciej identyfikować problemy z pamięcią, raporty różnic są sortowane według typów obiektów, które najbardziej zwiększyły swoją liczbę (kliknij link zmiany w kolumnie Objects (Różnice)) lub które najbardziej zwiększyły rozmiar sterty (kliknij link zmiany w kolumnie Rozmiar sterty (Różnice)).

  • Aby wyświetlić szczegóły tylko wybranej migawki, kliknij link bez zmian.

    Raport zostanie wyświetlony w osobnym oknie.

Raporty dotyczące typów zarządzanych

W tabeli podsumowania Użycie pamięci wybierz bieżący link komórki Objects (Diff).

Zrzut ekranu przedstawiający raport typu zarządzanego. raport typu zarządzanego

Notatka

W przypadku kodu platformy .NET ikona View Instances (Ikona wystąpienia w kolumnie Typ obiektu) jest dostępna tylko podczas korzystania z narzędzia debugera zintegrowanego użycia pamięci lub podczas otwierania migawki stert i wybrania Debuguj pamięć zarządzaną.

Górne okienko pokazuje liczbę i rozmiar typów w migawce, w tym rozmiar wszystkich obiektów, do których odwołuje się typ (rozmiar łączny).

Drzewo Ścieżki do korzenia w dolnym okienku wyświetla obiekty odwołujące się do typu wybranego w górnym okienku. Moduł odśmieceń pamięci platformy .NET czyści pamięć dla obiektu tylko wtedy, gdy ostatni typ odwołujący się do niego został zwolniony. Aby uzyskać więcej informacji na temat używania drzewa ścieżek do katalogu głównego, zobacz Analizowanie ścieżki gorącej do katalogu głównego.

Zrzut ekranu przedstawiający raport typu zarządzanego.

Górne okienko pokazuje liczbę i rozmiar typów w migawce, włącznie z rozmiarem wszystkich obiektów, na które wskazuje typ (rozmiar całkowity).

Drzewo Ścieżki do korzenia w dolnym okienku wyświetla obiekty odwołujące się do typu wybranego w górnym okienku. Moduł odśmieceń pamięci platformy .NET czyści pamięć dla obiektu tylko wtedy, gdy ostatni typ odwołujący się do niego został zwolniony.

Drzewo typów referencyjnych pokazuje odwołania, które są przechowywane przez typ wybrany w górnym panelu.

Zrzut ekranu przedstawiający raport o obiektach referencyjnych.

Drzewo Typy referencyjne wyświetla odwołania przechowywane przez typ wybrany w górnym okienku.

Zrzut ekranu raportu Obiekty referencyjne.

Aby wyświetlić wystąpienia wybranego typu w górnym okienku, kliknij ikonę Wyświetl wystąpienia obok typu obiektu.

Zrzut ekranu przedstawiający widok Wystąpienia w narzędziu Użycie pamięci.

Widok Instances wyświetla wystąpienia wybranego obiektu w migawki w górnym okienku. W okienku Ścieżki do root i Obiekty, do których odwołuje się, są wyświetlane obiekty odwołujące się do wybranego wystąpienia oraz typy, do których odwołuje się wybrane wystąpienie. Po zatrzymaniu debugera w punkcie, w którym migawka została wykonana, możesz umieścić kursor na komórce Value, aby wyświetlić wartości obiektu w poradzie narzędzia.

Zrzut ekranu przedstawiający widok Wystąpień w narzędziu Monitorowanie pamięci.

Widok Instances wyświetla wystąpienia wybranego obiektu w migawce w górnym okienku. W okienku Ścieżki do root i Obiekty, do których odwołuje się, są wyświetlane obiekty odwołujące się do wybranego wystąpienia oraz typy, do których odwołuje się wybrane wystąpienie. Po zatrzymaniu debugera w punkcie, w którym migawka została wykonana, możesz najechać kursorem na komórkę Value, aby wyświetlić wartości obiektu w podpowiedzi.

Raporty typów natywnych

Wybierz bieżący link komórki Alokacje (Różnica) lub Rozmiar sterty (Różnica) w tabeli podsumowania użycia pamięci w oknie Narzędzia diagnostyczne .

Widok typów wyświetla liczbę i rozmiar typów w migawce.

  • Wybierz ikonę Wyświetl wystąpienia obok wybranego typu, aby wyświetlić informacje o obiektach wybranego typu w migawce.

    Widok Instances wyświetla każde wystąpienie wybranego typu. Wybranie wystąpienia powoduje wyświetlenie stosu wywołań, który spowodował utworzenie wystąpienia w okienku stosu wywołań alokacji . (Te informacje są dostępne tylko podczas debugowania).

    Zrzut ekranu widoku instancji i panelu stosu wywołań alokacji.

  • Wybierz ikonę wystąpień (Ikona wystąpienia w kolumnie Typ obiektu) wybranego typu, aby wyświetlić informacje o obiektach wybranego typu w migawce.

    Widok Instances wyświetla każde wystąpienie wybranego typu. Wybranie wystąpienia powoduje wyświetlenie stosu wywołań, który spowodował utworzenie wystąpienia, w okienku alokacji stosu wywołań.

    Zrzut ekranu przedstawiający widok wystąpień i okienka stosu wywołań alokacji.

  • Wybierz Stacks, aby wyświetlić stos alokacji dla wybranego typu.

    zrzut ekranu widoku Stacks.

  • Wybierz pozycję Stacks View na liście Tryb widoku, aby wyświetlić stos alokacji dla wybranego typu.

    zrzut ekranu przedstawiający widok stosów.

Szczegółowe informacje o użyciu pamięci

W przypadku pamięci zarządzanej narzędzie Analizy pamięci zapewnia również wiele zaawansowanych wbudowanych funkcji automatycznego wglądu w szczegółowe informacje. Wybierz kartę Insights w raportach Typy Zarządzane, a wyświetli odpowiednie automatyczne analizy, takie jak zduplikowane ciągi, rzadkie tablicei problemy z zarządzaniem zdarzeniami.

Zrzut ekranu przedstawiający widok szczegółowych informacji w narzędziu Użycie pamięci. szczegółowe informacje o użyciu pamięci

W sekcji zduplikowane ciągi przedstawiono listę ciągów, które są przydzielane wiele razy na stercie. Ponadto ta sekcja pokazuje łączną ilość zmarnowanej pamięci, czyli (liczba wystąpień - 1) razy rozmiar ciągu.

W sekcji Tablice rozrzedzone przedstawiono tablice, które są w większości wypełnione elementami zerowymi, co może być nieefektywne pod względem wydajności i użycia pamięci. Narzędzie do analizy pamięci automatycznie wykryje te tablice i pokaże, ile pamięci jest marnowane z powodu tych wartości zerowych.

Sekcja Przecieki obsługi zdarzeń dostępna w programie Visual Studio 2022 w wersji 17.9 (wersja zapoznawcza 1) pokazuje potencjalne przecieki pamięci, które mogą wystąpić, gdy jeden obiekt subskrybuje zdarzenie innego obiektu. Jeśli wydawca zdarzenia przeżyje subskrybenta, subskrybent pozostaje żywy, nawet jeśli nie ma do niego żadnych innych odwołań. Może to prowadzić do przecieków pamięci, w których nieużywane pamięci nie są prawidłowo zwalniane, co powoduje, że aplikacja będzie używać coraz większej ilości pamięci w czasie.

Niektóre typy są znane z tego, że mają pola, które można odczytać, aby określić rozmiar pamięci natywnej, którą zajmują. Karta Insights przedstawia fałszywe natywne węzły pamięci na wykresie obiektów, które są przechowywane przez obiekty nadrzędne, tak aby interfejs użytkownika rozpoznał je i wyświetlił ich rozmiar i graf referencyjny.

Zrzut ekranu przedstawiający natywny widok informacji w narzędziu Użycie pamięci.

Raporty zmian (różnic)

  • Wybierz link do zmiany w komórce tabeli podsumowania zakładki Użycie pamięci w oknie Narzędzia diagnostyczne .

    Zrzut ekranu przedstawiający pozycję Wybierz link zmiany w komórce.

    Zrzut ekranu przedstawiający pozycję Wybierz link zmiany w komórce.

  • Wybierz migawkę z listy w Porównaj z raportu zarządzanego lub natywnego.

    Zrzut ekranu przedstawiający opcję Wybierz migawkę z listy Porównaj z.

    Zrzut ekranu przedstawiający pozycję Wybierz migawkę z listy Porównaj z.

Raport zmiany dodaje kolumny (oznaczone (Różnice)) do raportu podstawowego, które pokazują różnicę między wartościami migawki podstawowej a migawką porównawczą. Oto jak może wyglądać raport różnic widoku typu natywnego:

zrzut ekranu przedstawiający widok różnic typów natywnych.

Górny panel pokazuje liczbę i rozmiar typów w migawce, w tym rozmiar wszystkich obiektów, na które wskazuje typ (całkowity rozmiar).

Blogi i filmy wideo

analizowanie CPU i pamięci podczas debugowania

blog Visual C++: profilowanie pamięci w programie Visual C++ 2015

Następne kroki

W tym samouczku nauczyłeś się, jak zbierać i analizować dane dotyczące użycia pamięci. Jeśli ukończyłeś już przewodnik dotyczący profilera, warto rozważyć zapoznanie się z ogólnym podejściem do optymalizacji kodu z użyciem narzędzi do profilowania.

W tym samouczku nauczyłeś się, jak zbierać i analizować dane dotyczące użycia pamięci podczas debugowania. Możesz dowiedzieć się więcej na temat analizowania użycia pamięci w kompilacjach wydań przy użyciu profilera wydajności.