Sdílet prostřednictvím


Měření využití paměti v sadě Visual Studio (C#, Visual Basic, C++, F#)

Vyhledávejte úniky paměti a neefektivní využití paměti při ladění pomocí diagnostického nástroje integrovaného do ladicího programu Využití paměti. Nástroj Využití paměti umožňuje pořídit jeden nebo více snímků spravované a nativní haldy paměti, abyste pochopili dopad využití paměti typů objektů. Můžete také analyzovat využití paměti bez připojeného ladicího programu nebo cílením na spuštěnou aplikaci. Další informace najdete v tématu Spuštění nástrojů profilace v buildech vydaných verzí nebo ladění. Informace o výběru nejvhodnějšího nástroje pro analýzu paměti pro vaše potřeby naleznete v tématu Zvolit nástroj pro analýzu paměti.

I když snímky paměti můžete kdykoli shromažďovat v nástroji Využití paměti, můžete pomocí ladicího programu sady Visual Studio řídit, jak se aplikace spouští při zkoumání problémů s výkonem. Nastavení zarážek, krokování, funkce Přerušit vše a další akce ladicího programu vám mohou pomoci zaměřit se na vyšetřování výkonu v cestách kódu, které jsou nejvíce relevantní. Provádění těchto akcí během spuštění aplikace může eliminovat šum z kódu, který vás nezajímá, a může výrazně snížit dobu potřebnou k diagnostice problému.

Důležitý

Diagnostické nástroje integrované s ladicím programem jsou podporovány pro vývoj v .NET v sadě Visual Studio, včetně ASP.NET, ASP.NET Core, nativního vývoje v jazyce C++ a smíšených režimů aplikací (.NET a nativní).

V tomto kurzu:

  • Pořízení snímků paměti
  • Analýza dat o využití paměti

Pokud využití paměti neposkytuje potřebná data, jiné profilovací nástroje v profileru výkonu nabízejí různé druhy informací, které by pro vás mohly být užitečné. V mnoha případech může být kritickým bodem výkonu vaší aplikace něco jiného než paměť, jako je procesor, uživatelské rozhraní pro vykreslování nebo doba požadavků na síť.

Poznámka

Podpora vlastního alokátoru Nativní profiler paměti funguje tak, že shromažďuje data o přidělování ETW událostí generovaných během běhu programu. Alokátory v CRT a Windows SDK byly opatřeny poznámkami na úrovni zdroje, aby bylo možné zachytit jejich data přidělení. Pokud píšete vlastní alokátory, pak všechny funkce, které vracejí ukazatel na nově přidělenou paměť na haldě, mohou být označeny __declspec(alokátor), jak je vidět v tomto příkladu pro myMalloc:

__declspec(allocator) void* myMalloc(size_t size)

Shromažďování dat o využití paměti

  1. Otevřete projekt, který chcete ladit v sadě Visual Studio, a nastavte v aplikaci zarážku v místě, kde chcete začít zkoumat využití paměti.

    Pokud máte oblast, ve které máte podezření na problém s pamětí, nastavte první zarážku před výskytem problému s pamětí.

    Spropitné

    Vzhledem k tomu, že může být obtížné zaznamenat profil paměti operace, která vás zajímá, když aplikace často přiděluje a uvolňuje paměť, nastavte zarážky na začátku a na konci operace (nebo postupně procházejte operaci), abyste zjistili přesný bod, kdy se paměť změnila.

  2. Nastavte druhou zarážku na konci funkce nebo oblasti kódu, kterou chcete analyzovat (nebo po podezření na problém s pamětí).

  3. Okno Diagnostické nástroje se zobrazí automaticky, pokud jste ho nevypněte. Chcete-li znovu zobrazit okno, klikněte na Ladění>Windows>Zobrazit diagnostické nástroje.

  4. Zvolte Využití paměti s nastavením Vybrat nástroje na panelu nástrojů.

    snímek obrazovky s diagnostickými nástroji

    snímek obrazovky s diagnostickými nástroji

  5. Klikněte na Ladění / Spustit ladění (nebo Spustit na panelu nástrojů, nebo F5).

    Po dokončení načítání aplikace se zobrazí souhrnné zobrazení diagnostických nástrojů.

    Snímek obrazovky karty Souhrn diagnostických nástrojů.

    Poznámka

    Vzhledem k tomu, že shromažďování dat paměti může ovlivnit výkon ladění nativních nebo smíšených aplikací, jsou snímky paměti ve výchozím nastavení zakázané. Pokud chcete povolit snímky v aplikacích v nativním nebo smíšeném režimu, spusťte ladicí relaci (klávesová zkratka: F5). Když se zobrazí okno Diagnostické nástroje, zvolte kartu Využití paměti a pak zvolte Profilace hald.

    snímek obrazovky s možností Povolit snímky

    Zastavte (klávesová zkratka: Shift+F5) a restartujte ladění.

    Snímek obrazovky karty Souhrn diagnostických nástrojů.

    Poznámka

    Vzhledem k tomu, že shromažďování dat paměti může ovlivnit výkon ladění nativních nebo smíšených aplikací, jsou snímky paměti ve výchozím nastavení zakázané. Pokud chcete povolit snímky v nativních nebo smíšených režimech aplikací, spusťte ladicí relaci (klávesová zkratka: F5). Když se zobrazí okno Diagnostické nástroje, zvolte kartu Využití paměti a potom zvolte Profilace haldy.

    snímek obrazovky s možností Povolit snímky

    Zastavte (klávesová zkratka: Shift+F5) a restartujte ladění.

  6. Pokud chcete pořídit snímek na začátku ladicí relace, zvolte Pořídit snímek na panelu nástrojů souhrnu využití paměti . (Může být užitečné nastavit zde také výchozí bod.)

    snímek obrazovky s tlačítkem Pořízení snímku

    snímek obrazovky s tlačítkem Pořízení snímku

    Spropitné

    Pokud chcete vytvořit základní úroveň pro porovnání paměti, zvažte vytvoření snímku na začátku ladicí relace.

  7. Spusťte scénář, který aktivuje váš první bod přerušení.

  8. Zatímco je ladicí program pozastavený na první zarážce, zvolte Snímek na panelu nástrojů shrnutí Využití paměti.

  9. Stisknutím klávesy F5 spusťte aplikaci až k druhému bodu přerušení.

  10. Teď pořiďte další snímek.

    V tuto chvíli můžete začít analyzovat data.

    Pokud máte potíže se shromažďováním nebo zobrazováním dat, přečtěte si téma Řešení chyb profilace a oprava problémů.

Analýza dat o využití paměti

Řádky tabulky souhrnu využití paměti uvádějí snímky, které jste pořídili během relace ladění, a poskytují odkazy na podrobnější zobrazení.

snímek obrazovky s tabulkou Využití paměti

snímek obrazovky s tabulkou Využití paměti

Název sloupce závisí na režimu ladění, který zvolíte ve vlastnostech projektu: .NET, native nebo mixed (jak .NET, tak nativní).

  • Sloupec Objektů (Diff) (.NET) nebo Alokace (Diff) (C++) zobrazuje počet objektů v .NET nebo nativní paměti při pořízení snímku.

  • Sloupec Velikost haldy (Diff) zobrazuje počet bajtů v .NET a nativních haldách.

Po pořízení více snímků zahrnují buňky souhrnné tabulky změnu hodnoty mezi snímkem řádku a předchozím snímkem.

Pokud chcete analyzovat využití paměti, klikněte na jeden z odkazů, které otevře podrobnou sestavu využití paměti:

  • Pokud chcete zobrazit podrobnosti o rozdílu mezi aktuálním snímkem a předchozím snímkem, zvolte odkaz na změnu vlevo od šipky (Zvýšení využití paměti). Červená šipka označuje zvýšení využití paměti a zelená šipka značí snížení.

Spropitné

Aby bylo možné rychleji identifikovat problémy s pamětí, jsou sestavy rozdílů seřazeny podle typů objektů, které nejvíce zvýšily svůj celkový počet (klikněte na odkaz změny v sloupci Objekty (Diff)) nebo které nejvíce zvýšily svou celkovou velikost haldy (klikněte na odkaz změny ve sloupci Velikost haldy (Rozdíl)).

  • Pokud chcete zobrazit podrobnosti pouze vybraného snímku, klikněte na odkaz, který se nezmění.

    Sestava se zobrazí v samostatném okně.

Sestavy spravovaných typů

Zvolte aktuální propojení buňky Objekty (Diff) v souhrnné tabulce Využití paměti.

Snímek obrazovky se sestavou spravovaného typu

Poznámka

Pro kód .NET je ikona Zobrazit instance (Ikona instance ve sloupci Typ objektu) dostupná pouze při použití nástroje Využití paměti integrovaného s debuggerem nebo při otevření snímku haldy a volbě Ladění spravované paměti .

Horní podokno zobrazuje počet a velikost typů snímku, včetně velikosti všech objektů, na které odkazuje typ (Inkluzivní velikost).

Strom Cesty ke kořeni v dolním podokně zobrazuje objekty, které odkazují na typ vybraný v horním podokně. .NET garbage collector čistí paměť pro objekt pouze tehdy, když byla uvolněna poslední reference na tento objekt. Další informace o použití stromu Cesty ke kořenovému naleznete v tématu Analýza horké cesty ke kořenovému.

Snímek obrazovky sestavy spravovaného typu.

Horní podokno zobrazuje počet a velikost typů v rámci snímku, včetně velikosti všech objektů, na které se typ odkazuje (Inkluzivní velikost).

V dolním podokně ve stromu Cesty ke kořenu se zobrazují objekty, které odkazují na typ vybraný v horním podokně. .NET garbage collector vykoná čištění paměti pro objekt pouze tehdy, když byl uvolněn poslední odkazující typ.

Strom Odkazované typy zobrazí odkazy, které jsou uloženy typem vybraným v horním podokně.

snímek obrazovky se sestavou odkazovaných objektů

Strom Odkazované typy zobrazuje odkazy, které jsou drženy typem vybraným v horním podokně.

snímek obrazovky se sestavou odkazovaných objektů

Pokud chcete zobrazit instance vybraného typu v horním podokně, klikněte na ikonu Zobrazit instance vedle typu objektu.

Snímek obrazovky zobrazení Instances v nástroji Využití paměti.

Pohled na Instance zobrazuje instance vybraného objektu ve snímku v horní části okna. Podokno Cesty ke kořenovému a Odkazované objekty zobrazí objekty odkazující na vybranou instanci a typy, na které odkazuje vybraná instance. Když se ladicí program zastaví v okamžiku pořízení snímku, můžete najet myší na buňku Hodnota a zobrazit hodnoty objektu jako tip.

Snímek obrazovky se zobrazením Instances v nástroji Využití paměti.

Zobrazení Instance zobrazí instance vybraného objektu v snímku v horním podokně. Podokno Cesty ke kořenovému objektu a Odkazované objekty zobrazuje objekty, které odkazují na vybranou instanci, a typy, na které vybraná instance odkazuje. Když se ladicí program zastaví v okamžiku pořízení snímku, můžete najet myší na buňku Hodnota a zobrazit hodnoty objektu v popisku nástroje.

Sestavy nativních typů

Zvolte aktuální odkaz přidělení (Rozdíl) nebo velikost haldy (Rozdíl) v tabulce Souhrn využití paměti v okně diagnostické nástroje.

Zobrazení Typy zobrazuje počet a velikost typů v snímku.

  • Výběrem ikony Zobrazit instance vedle vybraného typu zobrazíte informace o objektech vybraného typu ve snímku.

    Zobrazení Instance zobrazí každou instanci vybraného typu. Výběrem instance se zobrazí zásobník volání vedoucí k vytvoření instance v podokně Zásobník volání přidělení. (Tyto informace jsou dostupné pouze při ladění.)

    snímek obrazovky se zobrazením instancí a podoknem Zásobník volání přidělení

  • Zvolte ikonu instance (Ikona instance ve sloupci Typ objektu) vybraného typu, aby se zobrazily informace o objektech vybraného typu ve snímku.

    Zobrazení Instance zobrazuje každou instanci vybraného typu. Výběrem instance se zobrazí zásobník volání, který vedl k vytvoření instance v podokně nazvaném Zásobník volání přidělení.

    snímek obrazovky se zobrazením Instancí a podoknem Zásobník volání přidělení

  • Zvolte Stacks a zobrazte zásobník přidělení pro vybraný typ.

    snímek obrazovky se zobrazením Zásobníky

  • V seznamu Režim zobrazení zvolte Zobrazení zásobníků, abyste viděli přidělený zásobník pro vybraný typ.

    Snímek obrazovky Zobrazení Zásobníků

Přehledy využití paměti

Pro spravovanou paměť poskytuje nástroj Analýza paměti také několik výkonných integrovaných automatických přehledů. V sestavách spravovaných typů vyberte kartu Insights a zobrazí se příslušné automatické přehledy, jako jsou duplicitní řetězce, řídké polea úniky obslužných rutin událostí.

Snímek obrazovky nástroje Využití paměti se zobrazením přehledu.

Oddíl Duplicitní řetězce ukazuje seznam řetězců, které se přidělují vícekrát v haldě. Kromě toho tato část ukazuje celkovou ztrátu paměti, tj. (počet instancí – 1) krát velikost řetězce.

Oddíl řídká pole ukazuje pole, která jsou většinou naplněna nulovými prvky, což může být neefektivní, pokud jde o výkon a využití paměti. Nástroj pro analýzu paměti automaticky rozpozná tato pole a ukáže vám, kolik paměti je mrhána kvůli těmto nulovým hodnotám.

Část Úniky paměti způsobené obslužnými rutinami událostí, která je dostupná v sadě Visual Studio 2022 verze 17.9 Preview 1, ukazuje potenciální úniky paměti, které mohou nastat, když se jeden objekt přihlásí k odběru události jiného objektu. Pokud vydavatel události prožije odběratele, odběratel zůstává aktivní, i když na něj nejsou žádné další odkazy. To může vést k úniku paměti, kdy není správně uvolněna nepoužitá paměť, což způsobí, že aplikace bude v průběhu času používat čím dál více paměti.

U některých typů je známo, že mají pole, která lze přečíst k určení velikosti nativní paměti, kterou drží. Karta Insights zobrazuje falešné nativní paměťové uzly v grafu objektů, které jsou zachovány nadřazenými objekty tak, aby je uživatelské rozhraní rozpoznalo a zobrazilo jejich velikost a referenční graf.

snímek obrazovky s nativním zobrazením přehledu v nástroji Využití paměti

Zprávy o změnách (rozdíly)

  • Vyberte změnový odkaz v buňce souhrnné tabulky na kartě Využití paměti v okně Diagnostické nástroje.

    Snímek obrazovky s odkazem pro výběr změny v buňce

    snímek obrazovky s výběrem odkazu na změnu v buňce

  • Vyberte snímek v seznamu Porovnat s spravovanou nebo nativní sestavou.

    Snímek obrazovky s možností výběru snímku ze seznamu Porovnat s.

    Snímek obrazovky s výběrem snímku ze seznamu Porovnat s

Sestava změn přidá do základní sestavy sloupce (označené (Rozdíl)), které ukazují rozdíl mezi hodnotou výchozího snímku a porovnávacím snímkem. Takto může vypadat rozdílová zpráva pro zobrazení nativního typu:

snímek obrazovky s zobrazením rozdílu nativních typů

Horní podokno zobrazuje počet a velikost typů v snímku, včetně velikosti všech objektů, na které daný typ odkazuje (Inkluzivní velikost).

Blogy a videa

Analyzujte Procesor a Paměť při Ladění

Blog Visual C++: Profilace paměti v sadě Visual C++ 2015

Další kroky

V tomto kurzu jste se naučili shromažďovat a analyzovat data o využití paměti. Pokud jste již absolvovali úvodní prohlídku profileru , můžete si přečíst o obecném přístupu k optimalizaci kódu pomocí nástrojů pro profilování.

V tomto kurzu jste se naučili shromažďovat a analyzovat data o využití paměti při ladění. Možná budete chtít zjistit další informace o analýze využití paměti v buildech vydaných verzí pomocí profileru výkonu.

Analýza využití paměti v Profileru výkonu