Udostępnij za pośrednictwem


Analizowanie użycia pamięci w kompilacjach wydań (C#, Visual Basic, C++, F#)

Narzędzie Użycie pamięci monitoruje użycie pamięci aplikacji. Możesz użyć tego narzędzia, aby przeanalizować efekty pamięci w czasie rzeczywistym w scenariuszach, które aktywnie opracowujesz w Visual Studio. Możesz wykonać szczegółowe migawki stanów pamięci aplikacji i porównać migawki, aby znaleźć główne przyczyny problemów z pamięcią. Narzędzie Użycie pamięci jest obsługiwane w aplikacjach .NET, ASP.NET, C++lub trybie mieszanym (.NET i natywnym).

Narzędzie Użycie pamięci może uruchamiać w kompilacjach wydania lub debugowania. W tym artykule pokazujemy, jak używać narzędzia Użycie pamięci w Visual Studio Performance Profiler, co jest zalecane w przypadku kompilacji produkcyjnych. Aby uzyskać informacje na temat wybierania najlepszego narzędzia do analizy pamięci dla Twoich potrzeb, zobacz Wybierz narzędzie do analizy pamięci.

Aby uzyskać najlepsze doświadczenie w tej dokumentacji, wybierz preferowany język programowania lub środowisko uruchomieniowe z listy w górnej części artykułu.

Sesje diagnostyczne użycia pamięci

Aby rozpocząć sesję diagnostyki użycia pamięci:

  1. Otwórz projekt w Visual Studio.

    Narzędzie Użycie pamięci obsługuje aplikacje .NET, ASP.NET, C++, lub mieszane tryby (.NET i natywne).

  2. W menu Debug ustaw konfigurację rozwiązania na Release i wybierz cel wdrożenia.

    Cel wdrożenia zazwyczaj odpowiada nazwie projektu, co wskazuje na wdrożenie lokalne.

  3. Na pasku menu wybierz pozycję DebugAnalizator wydajności.

  1. Na karcie Elastyczne wybierz pozycję Użycie pamięci, a następnie wybierz pozycję Uruchom.

    Zrzut ekranu przedstawiający opcję Użycie pamięci i przycisk Uruchom.

  1. W obszarze Dostępne narzędzia, wybierz pozycję Użycie pamięci, a następnie wybierz pozycję Rozpocznij. Rozpocznij sesję diagnostyki użycia pamięci.

Notatka

W przypadku niektórych typów projektów, takich jak CMake, należy ustawić docelowy cel startowy na Executable. Aby uzyskać więcej informacji, zobacz Jakie narzędzia są obsługiwane dla mojego projektu?.

Monitorowanie użycia pamięci

Po uruchomieniu sesji diagnostycznej aplikacja zostanie uruchomiona, a w oknie narzędzia diagnostyczne zostanie wyświetlony wykres osi czasu użycia pamięci aplikacji.

Zrzut ekranu okna Narzędzia diagnostyczne w profilerze wydajności Visual Studio przedstawiający wykres osi czasu użycia pamięci aplikacji.

Zrzut ekranu okna Narzędzia diagnostyczne w profilerze wydajności Visual Studio przedstawiający wykres osi czasu użycia pamięci aplikacji.

Wykres osi czasu przedstawia wahania pamięci podczas uruchamiania aplikacji. Skoki na wykresie zwykle wskazują, że jakiś kod zbiera lub tworzy dane, a następnie odrzuca je po zakończeniu przetwarzania. Duże skoki wskazują obszary, które można zoptymalizować. Głównym problemem jest wzrost zużycia pamięci, który nie jest zwracany. Może to wskazywać na nieefektywne użycie pamięci, a nawet przeciek pamięci.

Tworzenie migawek stanów pamięci aplikacji

Aplikacja używa dużej liczby obiektów i warto skoncentrować analizę na jednym scenariuszu. Możesz też znaleźć problemy z pamięcią do zbadania. Można robić migawki podczas sesji diagnostycznej, aby zarejestrować użycie pamięci w określonych momentach. Przed pojawieniem się problemu z pamięcią warto uzyskać wyjściową migawkę aplikacji. Możesz wykonać kolejną migawkę po pierwszym wystąpieniu problemu i dodatkowych migawek, jeśli możesz powtórzyć scenariusz.

Aby zebrać migawki, wybierz pozycję Wykonaj migawkę, gdy chcesz przechwycić dane pamięci.

Zrzut ekranu przedstawiający tworzenie migawki.

Zamykanie sesji diagnostycznej

Aby zatrzymać sesję monitorowania bez tworzenia raportu, zamknij okno diagnostyczne. Aby wygenerować raport po zakończeniu zbierania lub tworzenia migawek, wybierz pozycję Zatrzymaj zbieranie.

Zrzut ekranu przedstawiający zatrzymywanie kolekcji.

Zrzut ekranu przedstawiający zatrzymywanie kolekcji.

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

Raporty użycia pamięci

Po zatrzymaniu zbierania danych narzędzie Użycie pamięci zatrzymuje aplikację i wyświetla stronę przeglądu użycia pamięci .

Zrzut ekranu przedstawiający stronę przeglądu w narzędziu Użycie pamięci w profilerze wydajności Visual Studio, pokazujący wykres użycia pamięci i cztery panele migawkowe.

Zrzut ekranu przedstawiający stronę przeglądową w narzędziu Użycie pamięci w profilerze wydajności Visual Studio, pokazujący wykres użycia pamięci i dwa okna migawek.

Migawki użycia pamięci

Liczby w okienkach Snapshot pokazują obiekty i bajty w pamięci podczas wykonywania każdej migawki oraz różnicę między migawką a poprzednią.

Liczby to linki, które otwierają szczegółowe widoki raportów Memory Usage w nowych oknach Visual Studio. Raport szczegółów migawki przedstawia typy i wystąpienia w jednej migawce. Raport porównawczy różnic migawek porównuje typy i wystąpienia w dwóch migawkach.

Zrzut ekranu przedstawiający łącza widoku migawkilinków widoku migawki

W przypadku języka C++ kolumna Objects (Różnice) jest nazwana Allocations (Różnice).

obraz Opis
Krok 1Process Guide-1 Całkowita liczba obiektów w pamięci podczas wykonywania migawki. Wybierz ten link, aby wyświetlić raport szczegółów migawki posortowany według liczby wystąpień typów.
Krok 2Przewodnik po procesie-2 Różnica między całkowitą liczbą obiektów pamięci w tej migawce a poprzednią migawką. Wybierz ten link, aby wyświetlić raport różnic migawki posortowany według różnicy w łącznej liczbie wystąpień typów.
Krok 3Process Guide-3 Całkowita liczba bajtów w pamięci podczas wykonywania migawki. Wybierz ten link, aby wyświetlić raport szczegółów migawki posortowany według całkowitego rozmiaru wystąpień typu.
Krok 4Przewodnik Procesu-4 Różnica między całkowitym rozmiarem obiektów pamięci na tej migawce a poprzedniej migawce. Liczba dodatnia oznacza, że rozmiar pamięci tej migawki jest większy niż rozmiar poprzedniej migawki, a liczba ujemna oznacza, że rozmiar jest mniejszy. Wartość bazowa oznacza, że migawka jest pierwszą w sesji diagnostycznej. brak różnicy oznacza, że różnica wynosi zero. Wybierz ten link, aby wyświetlić raport różnic migawki posortowany według różnicy w całkowitym rozmiarze wystąpień typów.

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 .NET, ikona View Details (Ikona wystąpienia w kolumnie Typ obiektu) jest dostępna tylko podczas korzystania z narzędzia do analizy użycia pamięci zintegrowanego z debugerem lub gdy otwierasz migawkę sterty i wybierasz opcję Debugowanie pamięci zarządzanej.

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 .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. raport typu zarządzanego

Notatka

W przypadku kodu .NET, ikona View Instances (Ikona wystąpienia w kolumnie Typ obiektuDBG_MMA_InstancesIcon) jest dostępna tylko podczas korzystania z zintegrowanego z debugerem narzędzia użycia pamięci lub podczas otwierania migawki sterty i wybranie Debugowanie pamięci zarządzanej.

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 .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.

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 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.

Filtry drzewa raportów

W aplikacjach wiele komponentów nie jest potrzebnych do tego, by deweloperzy badali problemy z pamięcią. Filtry raportu migawki mogą ukrywać większość tych typów w drzewach pamięci zarządzanej i ścieżkach do korzenia.

Opcje sortowania i filtrowaniaSortowanie i filtrowanie według użycia pamięci

  • Aby filtrować drzewo według nazwy typu, wprowadź nazwę w polu Filtr. Filtr nie uwzględnia wielkości liter i rozpoznaje określony ciąg w dowolnej części nazwy typu.

  • wybierz Pokaż tylko mój kod na liście rozwijanej Filtr , aby ukryć większość wystąpień generowanych przez kod zewnętrzny. Typy zewnętrzne należą do systemu operacyjnego lub składników struktury lub są generowane przez kompilator.

  • Wybierz Zwiń małe obiekty na liście rozwijanej Filtr , aby ukryć typy, których rozmiar (bajty) jest mniejszy niż 0,5 procent całkowitej pamięci.

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 .

zrzut ekranu przedstawiający widok typu natywnego.

zrzut ekranu przedstawiający widok typu natywnego.

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

  • Wybierz ikonę Szczegóły obok wybranego typu, aby wyświetlić informacje o obiektach tego typu w migawce.

    Widok Instances pokazuje wszystkie wystąpienia wybranego typu. Wybranie wystąpienia powoduje wyświetlenie stosu wywołań, który doprowadził do jego utworzenia, w okienku Stosu Wywołań Alokacji. (Te informacje są dostępne tylko podczas debugowania).

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

  • Wybierz ikonę Pokaż instancje obok wybranego typu, aby wyświetlić informacje o obiektach wybranego typu w migawce.

    Widok Instances pokazuje wszystkie wystąpienia wybranego typu. Wybranie wystąpienia powoduje wyświetlenie stosu wywołań, który doprowadził do jego utworzenia, w okienku Stosu Wywołań Alokacji. (Te informacje są dostępne tylko podczas debugowania).

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

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

    zrzut ekranu przedstawiający widok Stacks.

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

    zrzut ekranu przedstawiający widok Stacks.

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, aby wyświetlić odpowiednie automatyczne wglądy, takie jak zduplikowane ciągi, tablice rozrzedzonei przecieki obsługi zdarzeń.

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

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 w tej sekcji przedstawiono łączną wielkość zmarnowanej pamięci, czyli (liczba wystąpień — 1) razy wielkość 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 Event Handler Leaks dostępna w 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 aktywny, nawet jeśli nie ma do niego żadnych innych referencji. 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 posiadania pól, które można odczytać, aby określić rozmiar pamięci natywnej, której używają. 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.natywny widok informacji w narzędziu Użycie pamięci

Zmiany (różnice) raportów

  • Wybierz link zmień w komórce okienka Snapshot na stronie Przegląd użycia pamięci.

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

  • Wybierz migawkę z listy Porównaj z raportem zarządzanym lub natywnym.

    Zrzut ekranu przedstawiający listę 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 dotyczący widoku typu natywnego:

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

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

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).