Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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 Memory Usage, můžete použít ladicí program Visual Studio k řízení způsobu spouštění aplikace 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.
Spropitné
Pomocí agenta GitHub Copilot Profiler můžete získat AI-řízené navádění pro sbírání a analýzu tras paměti.
Důležitý
Diagnostické nástroje integrované v ladicím programu jsou podporovány pro vývoj .NET v Visual Studio, včetně ASP.NET, ASP.NET Core, nativního vývoje a vývoje v jazyce C++ a smíšených aplikací (.NET a nativních).
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 project, které chcete ladit v Visual Studio, a nastavte zarážku v aplikaci 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íWindowsZobrazit diagnostické nástroje.
Zvolte Využití paměti pomocí nastavení Vybrat nástroje na panelu nástrojů.
Snímek obrazovky okna Diagnostické nástroje s nástrojem Využití paměti vybraným v rozevíracím seznamu Vybrat nástroje
Snímek obrazovky okna Diagnostické nástroje s nástrojem Využití paměti vybraným v rozevíracím seznamu Vybrat nástroje
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ů zobrazující časovou osu využití paměti a diagram paměti procesu.
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 panelu nástrojů Využití paměti, na kterém je zvýrazněno tlačítko Profilace haldy pro povolení snímků pro nativní nebo smíšené aplikace.
Zastavte (klávesová zkratka: ShiftF5) a restartujte ladění.
Snímek obrazovky karty Souhrn diagnostických nástrojů zobrazující časovou osu využití paměti a diagram paměti procesu.
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 panelu nástrojů Využití paměti, na kterém je zvýrazněno tlačítko Profilace haldy pro povolení snímků pro nativní nebo smíšené aplikace.
Zastavte (klávesová zkratka: ShiftF5) 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.)
Snímek obrazovky s panelem nástrojů Souhrn využití paměti 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.
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í.
Snímek obrazovky se souhrnnou tabulkou Využití paměti zobrazující dva snímky se sloupci pro objekty, velikost haldy a jejich rozdíly
Název sloupce závisí na režimu ladění, který zvolíte ve vlastnostech project: .NET, nativní nebo smíšené (.NET i nativní).
Sloupec Objects (Diff) (.NET) nebo Allocations (Diff) (C++) zobrazuje počet objektů v .NET nebo nativní paměti při pořízení snímku.
Sloupec Velikost haldy (rozdíl) zobrazuje počet bajtů v haldách .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ětizvýš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 typusestava spravovaného typu
Poznámka
Pro .NET kód je ikona Zobrazit podrobnosti (
ikona instance ve sloupci Typ objektu DBG_MMA_InstancesIcon) k dispozici pouze při použití nástroje debuggeru integrovaného k analýze využití paměti nebo když otevřete snímek haldy a zvolíte 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 uvolní paměť pro objekt pouze tehdy, když byl uvolněn poslední objekt, který na něj odkazuje. 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 se sestavou spravovaného typusestava spravovaného typu
Poznámka
Kód .NET: Ikona Zobrazit instance (
) je k dispozici pouze při použití nástroje nástroj pro práci s pamětí integrovaný v ladicím programu nebo když otevřete snímek haldy a vyberete 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 vyčistí paměť objektu pouze tehdy, když je uvolněn poslední objekt, který na něj odkazoval. Další informace o použití stromu Cesty ke kořenovému naleznete v tématu Analýza horké cesty ke kořenovému.
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 zobrazí odkazy, které jsou ulož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 podrobnosti vedle typu objektu.
Snímek obrazovky zobrazení Instances v nástroji Využití paměti.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.
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.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.
Sestavy nativních typů
V okně Diagnostické nástroje zvolte odkaz v aktuální buňce Přidělená paměť (Rozdíl) nebo Velikost haldy (Rozdíl) v tabulce Souhrn využití paměti.
snímek obrazovky s nativním zobrazením typu
snímek obrazovky s nativním zobrazením typu
Zobrazení Typy zobrazuje počet a velikost typů v snímku.
Výběrem ikony Zobrazit podrobnosti 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í
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 Stacks a zobrazte zásobník přidělení pro vybraný typ.
snímek obrazovky se zobrazením Zásobníky
Zvolte Stacks a zobrazte zásobník přidělení pro vybraný typ.
snímek obrazovky se zobrazením Zásobníky
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.Přehled využití paměti
Snímek obrazovky nástroje Využití paměti se zobrazením přehledu.Přehled využití paměti
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.
Oddíl Úniky obslužných rutin událostí, dostupný v Visual Studio 2022, verze 17.9 Preview 1, ukazuje potenciální úniky 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 ú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ětizobrazení nativního 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 se souhrnnou tabulkou Využití paměti se zvýrazněným odkazem na změnu v buňce snímku obrazovky.
Vyberte snímek v seznamu Porovnat s spravovanou nebo nativní sestavou.
Snímek obrazovky rozevíracího seznamu "Porovnat s" v sestavě "Využití paměti", který zobrazuje dostupné snímky pro porovnání.
Snímek obrazovky rozevíracího seznamu "Porovnat s" v sestavě "Využití paměti", který zobrazuje dostupné snímky pro porovnání.
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 se zobrazením rozdílu nativních typů.zobrazení rozdílu nativních typů
snímek obrazovky se zobrazením rozdílu nativních typů.zobrazení rozdílu nativních typů
Horní podokno zobrazuje počet a velikost typů snímku, včetně velikosti všech objektů, na které odkazuje typ (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 při ladění. Tady je několik navrhovaných dalších kroků:
- Pokud chcete analyzovat využití paměti v buildech vydaných verzí, přečtěte si téma Analýza využití paměti v profileru výkonu.
- Pokud se chcete naučit obecný přístup k optimalizaci kódu pomocí nástrojů pro profilaci, přečtěte si téma Případová studie: Příručka začátečníka k optimalizaci kódu.
- Pokyny k profilaci řízené AI najdete v tématu Profile aplikace pomocí agenta GitHub Copilot Profiler.
- Přehled všech nástrojů pro profilaci najdete v tématu První seznámení s nástroji pro profilaci.