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
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.
Nastavte druhou zarážku na konci funkce nebo oblasti kódu, kterou chcete analyzovat (nebo po podezření na problém s pamětí).
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.
Zvolte Využití paměti s nastavením Vybrat nástroje na panelu nástrojů.
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ů.
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.
Zastavte (klávesová zkratka: Shift+F5) a restartujte ladění.
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.
Zastavte (klávesová zkratka: Shift+F5) a restartujte ladění.
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.)
Spropitné
Pokud chcete vytvořit základní úroveň pro porovnání paměti, zvažte vytvoření snímku na začátku ladicí relace.
Spusťte scénář, který aktivuje váš první bod přerušení.
Zatímco je ladicí program pozastavený na první zarážce, zvolte Snímek na panelu nástrojů shrnutí Využití paměti.
Stisknutím klávesy F5 spusťte aplikaci až k druhému bodu přerušení.
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í.
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 (). Č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.
Poznámka
Pro kód .NET je ikona Zobrazit instance () 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.
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ě.
Strom Odkazované typy zobrazuje odkazy, které jsou drženy typem vybraným v horním podokně.
Pokud chcete zobrazit instance vybraného typu v horním podokně, klikněte na ikonu Zobrazit instance vedle typu objektu.
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.
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í.)
Zvolte ikonu instance () 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í.
V seznamu Režim zobrazení zvolte Zobrazení zásobníků, abyste viděli přidělený zásobník pro vybraný typ.
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í.
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.
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.
Vyberte snímek v seznamu Porovnat s spravovanou nebo nativní sestavou.
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:
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