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
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.
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 nevypnuli). Chcete-li znovu zobrazit okno, klepněte na tlačítko Ladění>systému Windows>Zobrazit diagnostické nástroje.
Zvolte Využití paměti s nastavením Vybrat nástroje na panelu nástrojů.
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ů.
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.
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 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.
Zastavte (klávesová zkratka: Shift+F5) a restartujte ladění.
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.)
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.
Spusťte scénář, který se zastaví u první zarážky.
Ladicí program je pozastavený na první zarážce, na panelu nástrojů Souhrn využití paměti zvolte Pořízení snímku.
Stisknutím klávesy F5 spusťte aplikaci na druhou zarážku.
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í.
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 (). Č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).
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ě.
Strom Odkazované typy zobrazuje odkazy, které jsou uloženy typem vybraným v horním podokně.
Pokud chcete zobrazit instance vybraného typu v horním podokně, klikněte na Zobrazit instance vedle typu objektu.
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).
Zobrazení Typy zobrazuje počet a velikost typů v snímku.
Výběrem ikony instancí () 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í.
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í.
V seznamu Režim zobrazení zvolte Zobrazení zásobníků, abyste zobrazili zásobník přidělení pro vybraný typ.
Zvolte Stacks (Zásobníky ) a zobrazí se zásobník přidělení 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 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.
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.
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 .
V seznamu Porovnat se spravovanou nebo nativní sestavou zvolte snímek.
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:
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.