Sdílet prostřednictvím


Analýza využití paměti v buildech vydaných verzí (C#, Visual Basic, C++, F#)

Nástroj Využití paměti monitoruje využití paměti vaší aplikace. Nástroj můžete použít ke studiu efektů paměti v reálném čase scénářů, které aktivně vyvíjíte v sadě Visual Studio. Můžete pořídit podrobné snímky stavů paměti aplikace a porovnat snímky a najít původní příčiny problémů s pamětí. Nástroj Využití paměti se podporuje v aplikacích .NET, ASP.NET, C++ nebo mixed mode (.NET a native).

Nástroj Využití paměti může spouštět při vydání nebo ladění sestavení. V tomto článku si ukážeme, jak používat nástroj Využití paměti v profileru výkonu sady Visual Studio , který se doporučuje pro sestavení verzí určených k uvolně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.

Nejlepší zkušenosti s touto dokumentací získáte tak, že v seznamu v horní části článku vyberete upřednostňovaný vývojový jazyk nebo modul runtime.

Diagnostické relace využití paměti

Chcete-li spustit diagnostickou relaci využití paměti:

  1. Otevřete projekt v sadě Visual Studio.

    Nástroj Využití paměti podporuje aplikace .NET, ASP.NET, C++ nebo smíšený režim (.NET a nativní).

  2. V nabídce Ladění nastavte konfiguraci řešení na Release a jako cíl nasazení vyberte Ladicí program systému Windows (nebo Místní počítač).

  3. Na řádku nabídek vyberteLadění>profileru výkonu .

  4. V části Dostupné nástroje, vyberte možnost Využití pamětia poté zvolte Start.

    Spusťte diagnostickou relaci využití paměti.

Monitorování využití paměti

Když spustíte diagnostickou relaci, spustí se vaše aplikace a v okně Diagnostické nástroje se zobrazí graf časové osy využití paměti vaší aplikace.

Snímek obrazovky okna Diagnostických nástrojů v Profileru výkonu sady Visual Studio, který zobrazuje graf časové osy využití paměti aplikace.

Graf časové osy zobrazuje kolísání paměti při spuštění aplikace. Špičky v grafu obvykle značí, že nějaký kód shromažďuje nebo vytváří data, a po dokončení zpracování je zahodí. Velké špičky označují oblasti, které můžete optimalizovat. Hlavním zájmem je nárůst spotřeby paměti, který se nevrátí. To může znamenat neefektivní využití paměti nebo dokonce únik paměti.

Pořízení snímků stavů paměti aplikace

Aplikace používá velký počet objektů a možná budete chtít soustředit analýzu na jeden scénář. Nebo můžete najít problémy s pamětí, které je potřeba prozkoumat. Během diagnostické relace můžete pořizovat snímky za účelem zachycení využití paměti v určitých okamžicích. Je dobré získat základní snímek aplikace, než se objeví potíže s pamětí. Po prvním výskytu problému můžete pořídit další snímek a další snímky, pokud můžete scénář zopakovat.

Pokud chcete shromažďovat snímky, vyberte Pořídit snímek, když chcete zachytit data paměti.

snímek obrazovky s pořízením snímku

Zavřít diagnostickou relaci

Chcete-li zastavit monitorovací relaci bez vytvoření sestavy, jednoduše zavřete okno diagnostiky. Pokud chcete vygenerovat zprávu po dokončení shromažďování dat nebo po pořízení snímků, vyberte Zastavit shromažďování.

snímek obrazovky zastavení sběru

snímek obrazovky ukončení sběru

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

Zprávy o využití paměti

Po zastavení shromažďování dat nástroj Využití paměti aplikaci zastaví a zobrazí stránku s přehledem Využití paměti.

Snímek obrazovky stránky přehledu v nástroji Využití paměti v profileru výkonu sady Visual Studio, který zobrazuje graf využití paměti a dvě podokna snímků.

Snímek obrazovky stránky přehledu v nástroji Využití paměti v profileru výkonu sady Visual Studio, který zobrazuje graf využití paměti a dvě podokna snímků.

Snímky využití paměti

Čísla v podoknech Snímek zobrazují objekty a bajty v paměti při pořízení každého snímku a rozdíl mezi snímkem a předchozím snímkem.

Čísla jsou odkazy, které v nových oknech sady Visual Studio otevírají podrobná zobrazení sestavy Využití paměti. Sestava podrobných informací o snímku uvádí typy a instance v jednom snímku. Seznam rozdílu snímků porovnává typy a instance ve dvou snímcích.

Snímek obrazovky s odkazy zobrazení snímků

Ve C++ je sloupec Objects (Diff) pojmenován Allocations (Diff).

Obraz Popis
krok 1 Celkový počet objektů v paměti při pořízení snímku. Výběrem tohoto odkazu zobrazíte sestavu podrobností snímku seřazenou podle počtu instancí typů.
krok 2 Rozdíl mezi celkovým počtem paměťových objektů v tomto snímku a předchozím snímkem. Výběrem tohoto odkazu zobrazíte diferenciální zprávu seřazenou podle rozdílu v celkovém počtu výskytů typů.
krok 3 Celkový počet bajtů v paměti při pořízení snímku. Výběrem tohoto odkazu zobrazíte sestavu podrobností snímku seřazenou podle celkové velikosti instancí typu.
krok 4 – průvodce procesem Rozdíl mezi celkovou velikostí paměťových objektů v tomto snímku a předchozím snímkem. Kladné číslo znamená, že velikost paměti tohoto snímku je větší než předchozí a záporné číslo znamená, že velikost je menší. Základní čára označuje, že snímek je první v diagnostické relaci. žádný rozdíl znamená, že rozdíl je nula. Výběrem tohoto odkazu zobrazíte sestavu rozdílů snímků, seřazenou podle rozdílu v celkové velikosti instancí typů.

odkazy zobrazení snímků

Obraz Popis
krok 1 Celkový počet bajtů v paměti při pořízení snímku. Výběrem tohoto odkazu zobrazíte sestavu podrobností snímku seřazenou podle celkové velikosti instancí typu.
krok 2 Celkový počet objektů v paměti při pořízení snímku. Výběrem tohoto odkazu zobrazíte sestavu podrobností snímku seřazenou podle počtu výskytů jednotlivých typů.
krok 3 Rozdíl mezi celkovou velikostí paměťových objektů v tomto snímku a předchozím snímkem. Kladné číslo znamená, že velikost paměti tohoto snímku je větší než předchozí a záporné číslo znamená, že velikost je menší. Výchozí stav znamená, že snímek je první v diagnostické relaci. žádný rozdíl znamená, že rozdíl je nula. Výběrem tohoto odkazu zobrazíte sestavu rozdílu snímku seřazenou podle rozdílu v celkové velikosti instancí typů.
krok 4 – průvodce procesem Rozdíl mezi celkovým počtem paměťových objektů v tomto snímku a předchozím snímkem. Kliknutím na tento odkaz zobrazíte zprávu o rozdílech ve snímku. Je seřazeno dle rozdílu v celkovém počtu instancí typů.

Sestavy spravovaných typů

Vyberte aktuální odkaz buňky Objektů (Diff) v souhrnné tabulce využití paměti.

Snímek obrazovky sestavy 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í integrovaného nástroje Využití paměti v debuggeru 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).

Ve stromu Cesty ke kořenovému v dolním podokně se zobrazí objekty, které odkazují na typ vybraný v horním podokně. .NET garbage collector vyčistí paměť pro objekt pouze tehdy, když je uvolněn poslední typ, který na něj odkazuje. Další informace o použití stromu Cesty ke kořenům naleznete v tématu Analýza horké cesty ke kořenům.

Snímek obrazovky se sestavou spravovaného typu

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

Ve stromu Cesty ke kořenu v dolním podokně se zobrazují objekty, které odkazují na typ vybraný v horním podokně. .NET garbage collector uvolní paměť pro objekt pouze tehdy, když byl uvolněn poslední typ, který na něj odkazuje.

Strom zobrazení Referencované typy zobrazuje reference držené typem vybraným v horním podokně.

snímek obrazovky zprávy o odkazovaných objektech

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

snímek obrazovky se sestavou odkazovaných objektů

Filtry stromu sestav

Mnoho typů v aplikacích není nutné, aby vývojáři aplikací prozkoumali problémy s pamětí. Filtry sestav snímků můžou skrýt většinu těchto typů v spravované paměti a cesty ke kořenům.

Možnosti řazení a filtrování

možnosti řazení a filtrování

  • Chcete-li filtrovat strom podle názvu typu, zadejte název do pole Filtr. Filtr nerozlišuje malá a velká písmena a rozpozná zadaný řetězec v libovolné části názvu typu.

  • Vyberte Pouze můj kód v rozbalovací nabídce Filtr, abyste skryli většinu instancí generovaných externím kódem. Externí typy patří do operačního systému nebo součástí architektury nebo jsou generovány kompilátorem.

  • Výběrem možnosti Sbalit malé objekty v rozevíracím seznamu Filtr skryjte typy, jejichž Velikost (Bajty) je menší než 0,5 procenta celkové paměti.

Sestavy nativních typů

Zvolte aktuální odkaz buňky 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.

    Výhled 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ě Zásobník volání přidělení. (Tyto informace jsou dostupné pouze při ladění.)

    Snímek obrazovky zobrazení instancí a přidělením zásobníku volání

  • 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 zobrazí každou instanci vybraného typu. Výběrem instance se zobrazí zásobník volání, který vedl ke vzniku instance, v okně 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 zobrazení Zásobníků

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

    Snímek obrazovky zobrazení Stacks.

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é poznatky, jako jsou duplicitní řetězce, řídká polea úniky obslužných rutin události .

snímek obrazovky se zobrazením přehledu v nástroji Využití paměti přehled využití paměti

Oddíl Duplicitní řetězce ukazuje seznam řetězců, které jsou přidělovány několikrát na hromadě. Kromě toho tato část ukazuje celkovou ztrátu paměti, tj. (počet instancí – 1) krát velikost řetězce.

Oddíl řídká pole zobrazuje pole, která jsou většinou naplněna nulovými prvky a která mohou 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 vám, kolik paměti je zbytečně využito kvůli těmto nulovým hodnotám.

Část Úniky paměti v obslužných rutinách 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 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 únikům paměti, kdy není správně uvolněna nevyužitá paměť, což způsobí, že aplikace bude postupem času využívat více paměti.

U některých typů je známo, že mají pole, která lze přečíst, aby určily velikost 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ílech)

  • Na stránce Přehled využití paměti zvolte odkaz na změnu v buňce podokna Snímek.

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

    Snímek obrazovky odkazu

  • Vyberte snímek v seznamu Porovnat s spravovanou nebo nativní zprávou.

    Snímek obrazovky s volbou snímku ze seznamu 'Porovnat s'.

    Snímek obrazovky s volbou 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 základního snímku a srovnávacím snímkem. Takto může vypadat zpráva rozdílu zobrazení nativního typu:

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

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