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

Vyhledejte nevracení paměti a neefektivní paměť při ladění pomocí nástroje pro diagnostiku využití paměti integrovaného ladicího programu. 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 naleznete v tématu Spuštění nástrojů profilace s ladicím programem nebo bez něj. Informace o výběru nejvhodnějšího nástroje pro analýzu paměti pro vaše potřeby najdete v tématu Volba nástroje pro analýzu paměti.

I když můžete v nástroji Využití paměti kdykoli shromažďovat snímky 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í, přerušení a dalších akcí ladicího programu vám může pomoct zaměřit se na zkoumání výkonu na cesty kódu, které jsou nejrelevavantnější. 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é

Ladicí program integrované diagnostické nástroje jsou podporovány pro vývoj v .NET v sadě Visual Studio, včetně ASP.NET, ASP.NET Core, nativního vývoje nebo vývoje v jazyce C++ a smíšených aplikací (.NET a nativních). Systém Windows 8 a novější se vyžaduje ke spuštění nástrojů profilace pomocí ladicího programu (okno Diagnostické nástroje ).

V tomto kurzu:

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

Pokud využití paměti neposkytuje data, která potřebujete, další nástroje profilace v profileru výkonu poskytují 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:

Vlastní alokátor podporuje nativní profiler paměti tím, že shromažďuje data událostí pro Windows přidělení generované během běhu. 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ěť haldy, mohou být zdobeny __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í.

    Tip

    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 přiděluje paměť, nastavte zarážky na začátku a na konci operace (nebo krokujte operací), abyste našli 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 nevypnuli). Chcete-li znovu zobrazit okno, klepněte na tlačítko Ladění>systému Windows>Zobrazit diagnostické nástroje.

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

    Screenshot of Diagnostics Tools.

    Screenshot of Diagnostics Tools.

  5. Klikněte na Ladit / Spustit ladění (nebo na panelu nástrojů stiskněte Start nebo F5).

    Jakmile se aplikace načte, zobrazí se souhrnný přehled diagnostických nástrojů.

    Screenshot of Diagnostics Tools Summary Tab.

    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 aplikacích, 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 haldy.

    Screenshot of Enable snapshots.

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

    Screenshot of Diagnostics Tools Summary Tab.

    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 aplikacích, 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 haldy.

    Screenshot of Enable snapshots.

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

  6. Pokud chcete pořídit snímek na začátku ladicí relace, na panelu nástrojů Souhrn využití paměti zvolte Pořízení snímku. (Může vám pomoct nastavit i zarážku.)

    Screenshot of Take Snapshot button.

    Screenshot of Take Snapshot button.

    Tip

    Pokud chcete vytvořit směrný plán pro porovnání paměti, zvažte pořízení snímku na začátku ladicí relace.

  7. Spusťte scénář, který se zastaví u první zarážky.

  8. Ladicí program je pozastavený na první zarážce, na panelu nástrojů Souhrn využití paměti zvolte Pořízení snímku.

  9. Stisknutím klávesy F5 spusťte aplikaci na druhou zarážku.

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

    Teď 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 řešení 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í.

Screenshot of Memory Usage table.

Screenshot of Memory Usage table.

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

  • Sloupce Objects (Diff) a Allocations (Diff) zobrazují počet objektů v .NET a nativní paměti při pořízení snímku.

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

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 (Memory Usage Increase). Červená šipka označuje zvýšení využití paměti a zelená šipka značí snížení.

Tip

Aby bylo možné rychleji identifikovat problémy s pamětí, sestavy rozdílů jsou seřazené podle typů objektů, které zvýšily nejvíce celkového počtu (klikněte na odkaz na změnu ve sloupci Objekty (Diff) nebo se zvýšily nejvíce v celkové velikosti haldy (klikněte na odkaz na změnu ve sloupci Velikost haldy (Diff ).

  • 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ů

V souhrnné tabulce Využití paměti zvolte aktuální odkaz na buňku Objekty (Rozdíl) nebo Přidělení (Rozdíl).

Screenshot of managed type report.

Screenshot of managed type report.

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

Cesta ke kořenovému stromu v dolním podokně zobrazí objekty, které odkazují na typ vybraný v horním podokně. Uvolňování paměti .NET vyčistí paměť pro objekt pouze v případě, že byl vydán poslední typ, který na něj odkazuje.

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

Screenshot of Referenced Objects report.

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

Screenshot of Referenced Objects report.

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

Screenshot of the Instances view in the Memory Usage tool.

Screenshot of the Instances view in the Memory Usage tool.

Zobrazení Instances zobrazuje instance vybraného objektu ve snímku v horním podokně. Podokno Cesty ke kořenovému objektu a odkazovaným objektům zobrazuje objekty odkazující 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ího typu

V souhrnné tabulce Využití paměti v okně Diagnostické nástroje zvolte aktuální odkaz na buňku Přidělení (Rozdíl) nebo Velikost haldy (Rozdíl).

Screenshot of Native Type View.

Screenshot of Native Type View.

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

  • Výběrem ikony instancí (The instance icon in the Object Type column) vybraného typu zobrazíte informace o objektech vybraného typu ve snímku.

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

    Screenshot of the Instances view and Allocation Call Stack pane.

  • Zvolte Zobrazit instance vedle vybraného typu, aby se zobrazily informace o objektech vybraného typu ve snímku.

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

    Screenshot of the Instances view and Allocation Call Stack pane.

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

    Screenshot of Stacks view.

  • Zvolte Stacks (Zásobníky ) a zobrazí se zásobník přidělení pro vybraný typ.

    Screenshot of Stacks view.

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 Přehledy a zobrazí se příslušné automatické přehledy, jako jsou duplicitní řetězce, řídké pole a nevracení obslužné rutiny události.

Screenshot of the insight view in the Memory Usage tool.

Oddíl Duplicitní řetězce zobrazuje 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.

Část Řídké pole zobrazuje pole, která jsou většinou naplněna nulovými prvky, což může být neefektivní z hlediska výkonu a využití paměti. Nástroj pro analýzu paměti automaticky rozpozná tato pole a ukáže, kolik paměti je kvůli těmto nulovým hodnotám plýtvání.

Část Nevracení obslužné rutiny události, která je k dispozici v sadě Visual Studio 2022 verze 17.9 Preview 1, ukazuje potenciální nevracení paměti, ke kterým může dojít, když se jeden objekt přihlásí k odběru události jiného objektu. Pokud vydavatel události přežije odběratele, zůstane odběratel naživu, i když na něj nejsou žádné další odkazy. To může vést k nevracení paměti, kdy není správně uvolněna nevyužitá paměť, což způsobí, že aplikace bude v průběhu času používat více a více paměti.

U některých typů je známo, že pole, která je možné přečíst, a určit velikost nativní paměti, na kterou se drží. Karta Přehledy 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.

Screenshot of the native insight view in the Memory Usage tool.

Změny (rozdílové) sestavy

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

    Screenshot of Choose a change link in a cell.

    Screenshot of Choose a change link in a cell.

  • V seznamu Porovnat se spravovanou nebo nativní sestavou zvolte snímek.

    Screenshot of Choose a snapshot from the Compare To list.

    Screenshot of Choose a snapshot from the Compare with list.

Sestava změn přidá do základní sestavy sloupce (označené pomocí rozdílu), které zobrazují rozdíl mezi hodnotou základního snímku a snímkem porovnání. Tady je postup, jak může vypadat sestava rozdílového zobrazení nativního typu:

Screenshot of Native Types Diff View.

Screenshot of Native Types Diff View.

Blogy a videa

Analýza procesoru a paměti při ladění

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

Další kroky

V tomto kurzu jste se naučili shromažďovat a analyzovat data o využití paměti. Pokud jste už dokončili prohlídku profileru, možná si budete chtít přečíst o obecném přístupu k optimalizaci kódu pomocí nástrojů pro profilaci.

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.