Megosztás a következőn keresztül:


Memóriahasználat mérése a Visual Studióban (C#, Visual Basic, C++, F#)

A hibakeresővel integrált memóriahasználati diagnosztikai eszközzel hibakeresés közben memóriavesztéseket és nem hatékony memóriát talál. A Memóriahasználat eszközzel egy vagy több pillanatképet készíthet, a felügyelt és a natív memória halomról, hogy megértse az objektumtípusok memóriahasználati hatását. A memóriahasználatot hibakereső csatolása nélkül vagy egy futó alkalmazás megcélzásával is elemezheti. További információ: Profilkészítési eszközök futtatása kiadási vagy hibakeresési buildeken. Az igényeinek leginkább megfelelő memóriaelemző eszköz kiválasztásáról további információt Memóriaelemző eszköz kiválasztásacímű témakörben talál.

Bár a memória pillanatképeit bármikor összegyűjtheti a memóriahasználati eszközben, a Visual Studio hibakeresőjével szabályozhatja, hogyan fut az alkalmazás a teljesítményproblémák kivizsgálása során. A töréspontok beállítása, a lépésenkénti végrehajtás, a végrehajtás megszakítása és más hibakereső műveletek segítségével a teljesítményvizsgálatait a legrelevánsabb kódútvonalakra összpontosíthatja. Ha ezeket a műveleteket az alkalmazás futtatása közben hajtja végre, azzal kiküszöbölheti a nem önt érdeklő kód zaját, és jelentősen csökkentheti a probléma diagnosztizálásához szükséges időt.

Fontos

A hibakereső által integrált diagnosztikai eszközök támogatottak a Visual Studióban a .NET-fejlesztéshez, beleértve a ASP.NET, a ASP.NET Core-t, a natív/C++ fejlesztést és a vegyes módú (.NET és natív) alkalmazásokat.

Ebben az oktatóanyagban a következőket fogja megtanulni:

  • Pillanatképek készítése a memóriáról
  • Memóriahasználati adatok elemzése

Ha memóriahasználati nem adja meg a szükséges adatokat, a teljesítményprofilozó más profilkészítő eszközei különböző típusú információkat nyújtanak, amelyek hasznosak lehetnek Önnek. Az alkalmazás teljesítménybeli szűk keresztmetszetét sok esetben a memórián kívül más is okozhatja, például a processzor, a felhasználói felület renderelése vagy a hálózati kérések ideje.

Jegyzet

Egyéni kiosztó támogatása A natív memóriaprofilozó a kiosztási ETW futásidőben kibocsátott eseményadatok gyűjtésével működik. A CRT-ben és a Windows SDK-ban lévő memóriakezelők a forrásszinten lettek megjegyzésekkel ellátva, hogy a foglalási adatok rögzíthetők legyenek. Ha saját allokátorokat ír, akkor az újonnan lefoglalt halommemóriára mutató mutatót visszaadó függvények __declspec(allocator) kulcsszóval láthatók el, ahogy az a myMalloc példában látható:

__declspec(allocator) void* myMalloc(size_t size)

Memóriahasználati adatok gyűjtése

  1. Nyissa meg a Visual Studióban hibakeresésre használni kívánt projektet, és állítson be egy töréspontot az alkalmazásban arra a pontra, ahol meg szeretné kezdeni a memóriahasználat vizsgálatát.

    Ha van egy olyan területe, ahol memóriaproblémára gyanakszik, állítsa be az első töréspontot a memóriaproblémák bekövetkezése előtt.

    Borravaló

    Mivel kihívást jelenthet egy olyan művelet memóriaprofiljának rögzítése, amely akkor érdekes, ha az alkalmazás gyakran lefoglalja és lefoglalja a memóriát, töréspontokat állíthat be a művelet elején és végén (vagy lépésről lépésre), hogy megtalálja a memóriaváltozás pontos pontját.

  2. Állítson be egy második töréspontot az elemezni kívánt függvény vagy kódterület végén (vagy egy feltételezett memóriaproblémát követően).

  3. A Diagnosztikai eszközök ablak automatikusan megjelenik, kivéve, ha kikapcsolta. Az ablak újbóli megjelenítéséhez kattintson Hibakeresés>Windows>Diagnosztikai eszközök megjelenítéseelemre.

  4. Válassza a Memóriahasználat opciót az eszköztáron az Eszközök kijelölése beállítással.

    Diagnosztikai eszközök képernyőképe.

    Diagnosztikai eszközök képernyőképe.

  5. Kattintson a Hibakeresés/Hibakeresés indítására (vagy a Kezdés gombra az eszköztáron, vagy nyomja meg az F5billentyűt).

    Amikor az alkalmazás betöltődik, megjelenik a Diagnosztikai eszközök összefoglaló nézete.

    Diagnosztikai eszközök összefoglaló lapjának képernyőképe.

    Jegyzet

    Mivel a memóriaadatok gyűjtése hatással lehet a natív vagy vegyes módú alkalmazások hibakeresési teljesítményére, a memória pillanatképei alapértelmezés szerint le vannak tiltva. Ha natív vagy vegyes módban szeretné engedélyezni a pillanatképeket, indítsa el a hibakeresési munkamenetet (billentyűparancs: F5). Amikor megjelenik a Diagnosztikai eszközök ablak, válassza a Memóriahasználat lapot, majd válassza a Halomprofil-lehetőséget.

    Pillanatképek engedélyezésének képernyőképe.

    Leállítás (billentyűparancs: Shift+F5) és indítsa újra a hibakeresést.

    Diagnosztikai eszközök összefoglaló lapjának képernyőképe.

    Jegyzet

    Mivel a memóriaadatok gyűjtése hatással lehet a natív vagy vegyes módú alkalmazások hibakeresési teljesítményére, a memória pillanatképei alapértelmezés szerint le vannak tiltva. Ha natív vagy vegyes módban szeretné engedélyezni a pillanatképeket, indítsa el a hibakeresési munkamenetet (billentyűparancs: F5). Amikor megjelenik a Diagnosztikai eszközök ablak, válassza a Memóriahasználat lapot, majd válassza a Halomprofillehetőséget.

    Pillanatképek engedélyezésének képernyőképe.

    Leállítás (billentyűparancs: Shift+F5) és indítsa újra a hibakeresést.

  6. Ha pillanatképet szeretne készíteni a hibakeresési munkamenet elején, válassza Pillanatkép készítése a Memóriahasználat összefoglaló eszköztáron. (Itt is segíthet egy töréspont beállításában.)

    Pillanatkép készítése gomb képernyőképe.

    Pillanatkép készítése gomb képernyőképe.

    Borravaló

    A memória-összehasonlítás alapkonfigurációjának létrehozásához érdemes lehet pillanatképet készíteni a hibakeresési munkamenet elején.

  7. Futtassa azt a forgatókönyvet, amelynél eléri az első töréspontot.

  8. Bár a hibakereső az első töréspontnál szünetel, válassza a Pillanatkép készítése lehetőséget a Memóriahasználat összegző eszköztáron.

  9. Nyomja meg a F5 gombokat az alkalmazás futtatásához a második szünetpontig.

  10. Most készítsen egy újabb pillanatképet.

    Ezen a ponton megkezdheti az adatok elemzését.

    Ha nem tud adatokat gyűjteni vagy megjeleníteni, olvassa el Profilkészítési hibák elhárítása ésproblémák elhárítása című témakört.

Memóriahasználati adatok elemzése

A Memóriahasználat összegző táblázat sorai felsorolják a hibakeresési munkamenet során készített pillanatképeket, és részletesebb nézetekre mutató hivatkozásokat tartalmaznak.

Memóriahasználat táblázat képernyőképe.

Memóriahasználat táblázat képernyőképe.

Az oszlop neve a projekttulajdonságokban kiválasztott hibakeresési módtól függ: .NET, natív vagy vegyes (.NET és natív).

  • A Objects (Diff) (.NET) vagy Allocations (Diff) (C++) oszlop megjeleníti az objektumok számát a .NET-ben vagy a natív memóriában a pillanatkép készítésekor.

  • A halomméret (Diff) oszlop a .NET és a natív halom bájtjainak számát jeleníti meg

Ha több pillanatképet készített, az összegző táblázat cellái tartalmazzák a sor-pillanatkép és az előző pillanatkép közötti érték változását.

A memóriahasználat elemzéséhez kattintson az egyik hivatkozásra, amely megnyitja a memóriahasználat részletes jelentését:

  • Az aktuális pillanatkép és az előző pillanatkép közötti különbség részleteinek megtekintéséhez válassza a nyíltól balra található változáshivatkozást (Memóriahasználat növelése). A piros nyíl a memóriahasználat növekedését, a zöld nyíl pedig a csökkenést jelzi.

Borravaló

A memóriaproblémák gyorsabb azonosítása érdekében a diff-jelentések olyan objektumtípusok szerint vannak rendezve, amelyek az összesített számban a legnagyobb mértékben növekedtek (kattintson a Objektumok (Diff) oszlopban lévő módosítási hivatkozásra, vagy a halomméretben a legnagyobb mértékben megnövelt értékre (kattintson a Halomméret (Diff) oszlop módosítási hivatkozására).

  • Ha csak a kijelölt pillanatkép részleteit szeretné megtekinteni, kattintson a módosítás nélküli hivatkozásra.

    A jelentés egy külön ablakban jelenik meg.

Felügyelt típusok jelentései

Válassza ki az objektumok (Diff) cella aktuális hivatkozását a Memóriahasználat összegzése táblában.

Felügyelt típusú jelentés képernyőképe.

Jegyzet

.NET-kód esetén a Példányok megtekintése ikon (A példány ikonja az Objektumtípus oszlopban) csak a hibakeresővel integrált memóriahasználati eszköz használatakor, vagy halomkép megnyitásakor és a felügyelt memória hibakeresésénekkiválasztásával érhető el.

A felső ablaktáblán a pillanatképben szereplő típusok száma és mérete látható, beleértve a típus által hivatkozott összes objektum méretét (Teljes méret).

Az alsó panelen található Gyökér fa elérési útjai megjelenítik a felső panelen kijelölt típusra hivatkozó objektumokat. A .NET-szemétgyűjtő csak akkor tisztítja meg az objektumok memóriáját, ha az utolsó, rá hivatkozó típus ki lett adva. A Gyökérhez vezető útvonalak fa használatáról több információt a Gyökérhez vezető forró útvonalelemzése című részben talál.

Felügyelt típusú jelentés képernyőképe.

A felső ablaktáblán a pillanatképben szereplő típusok száma és mérete látható, beleértve a típus által hivatkozott összes objektum méretét (Befogadó méret).

Az alsó panelen található Gyökér fa elérési útjai megjelenítik a felső panelen kijelölt típusra hivatkozó objektumokat. A .NET-szemétgyűjtő csak akkor tisztítja meg az objektumok memóriáját, ha az utolsó, rá hivatkozó típus ki lett adva.

A Hivatkozott típusok fa megjeleníti a felső panelen kiválasztott típus által tárolt hivatkozásokat.

A hivatkozott objektumok jelentésének képernyőképe.

A Hivatkozott típusok fa megjeleníti a felső panelen kiválasztott típus által tárolt hivatkozásokat.

A hivatkozott objektumok jelentésének képernyőképe.

Ha egy kijelölt típus példányait szeretné megjeleníteni a felső panelen, kattintson a Példányok megtekintése ikonra az objektumtípus mellett.

A Memóriahasználat eszköz Példányok nézetének képernyőképe.

A Példányok nézet a felső panel pillanatképében jeleníti meg a kijelölt objektum példányait. A Gyökérhez vezető utak és Hivatkozott objektumok panel megjeleníti a kijelölt példányra hivatkozó objektumokat és a kijelölt példány által hivatkozott típusokat. Amikor a hibakereső megáll azon a ponton, ahol a pillanatkép készült, az Érték cellára mutatva az objektum értékei megjelennek egy eszközleírásban.

A Memóriahasználat eszköz Példányok nézetének képernyőképe.

A Példányok nézet a felső panel pillanatképében jeleníti meg a kijelölt objektum példányait. A Gyökér elérési útjai és a Hivatkozott objektumok panel megjeleníti azokat az objektumokat, amelyek a kijelölt példányra hivatkoznak, valamint azokat a típusokat, amelyekre a kijelölt példány hivatkozik. Amikor a hibakereső megáll azon a ponton, ahol a pillanatképet készítették, az Érték cellára mutatva megtekintheti az objektum értékeit egy eszköztippben.

Natív típusok jelentései

A Diagnosztikai eszközök ablak memóriahasználati összefoglaló táblázatában válassza ki a foglalások (Diff) vagy halomméret (Diff) cellának aktuális hivatkozását.

A Típusnézet megjeleníti a pillanatképben szereplő típusok számát és méretét.

  • A kijelölt típus melletti Példányok megtekintése ikont választva megjelenítheti a pillanatképben a kijelölt típus objektumairól szóló információkat.

    A Példányok nézet a kijelölt típus minden példányát megjeleníti. A példány kiválasztásakor megjelenik az a hívásverem, amely a példány létrehozását eredményezte a Foglalási hívásverem panelen. (Ez az információ csak hibakeresés közben érhető el.)

    A képernyőkép a Példányok nézetről és a Foglalási hívásverem panelről.

  • Válassza a kijelölt típus példányainak ikonját (A kijelölt típus Objektumtípus oszlopának példányikonja) a pillanatképben a kijelölt típus objektumairól szóló információk megjelenítéséhez.

    A Példányok nézet a kijelölt típus minden példányát megjeleníti. A példány kiválasztásakor megjelenik az a hívásverem, amely a példány létrehozását eredményezte a Foglalási hívásverem panelen.

    A Példányok nézet és a Foglalási hívásverem panel képernyőképe.

  • Válassza a Stacks lehetőséget a kiválasztott típus kiosztási veremének megtekintéséhez.

    Stacks nézet képernyőképe.

  • A Nézet mód listában válassza a Stacks View lehetőséget a kijelölt típus foglalási veremének megtekintéséhez.

    Stacks nézet képernyőképe.

Memóriahasználati elemzések

A felügyelt memória esetében a Memóriaelemzési eszköz több hatékony beépített automatikus elemzést is biztosít. Válassza az Összefoglalók lapot a Felügyelt típusok jelentésben, és megjeleníti a vonatkozó automatikus elemzéseket, például Ismétlődő sztringek, Ritka tömbök, és Eseménykezelő szivárgások.

Képernyőkép a Memóriahasználati eszköz betekintési nézetéről.

A Duplikált karakterláncok szakasz azon karakterláncok listáját jeleníti meg, amelyek többször lefoglalásra kerülnek a halomba. Ezen kívül ez a szakasz a teljes felesleges memóriát jeleníti meg, azaz a (példányok száma – 1) szorozva a sztring méretével.

A Ritka tömbök szakasz olyan tömböket mutat be, amelyek többnyire nulla elemekkel vannak kitöltve, amelyek teljesítmény és memóriahasználat szempontjából nem hatékonyak. A memóriaelemző eszköz automatikusan észleli ezeket a tömböket, és megmutatja, hogy mennyi memória veszett el a nulla érték miatt.

Az Event Handler Leaks szakasz, amely a Visual Studio 2022 17.9 preview 1-es verziójában érhető el, olyan lehetséges memóriaszivárgásokat mutat be, amelyek akkor fordulhatnak elő, ha egy objektum feliratkozik egy másik objektum eseményére. Ha az esemény közzétevője túllép az előfizetőn, az előfizető életben marad, még akkor is, ha nincs más hivatkozás rá. Ez memóriavesztéshez vezethet, ahol a nem használt memória nincs megfelelően felszabadítva, ami azt eredményezi, hogy az alkalmazás idővel egyre több memóriát használ.

Bizonyos típusokról ismert, hogy rendelkeznek olyan mezőkkel, amelyek elolvashatók, hogy meghatározhassuk a natív memória méretét, amelyet ezek a típusok tartanak. A Insights lapon hamis natív memóriacsomópontok láthatók az objektumgráfban, amelyeket a szülőobjektumok őriznek meg, így a felhasználói felület felismeri őket, és megjeleníti a méret- és referenciagráfjukat.

A Memóriahasználat eszköz natív betekintési nézetének képernyőképe.

Változásjelentések (Diff)

  • A Diagnosztikai eszközök ablak Memóriahasználat lapjának összegző táblázatának egyik cellájában válassza a módosítási hivatkozást.

    Képernyőkép a cella változáshivatkozásának kiválasztásáról.

    Képernyőkép a cella változáshivatkozásának kiválasztásáról.

  • Válasszon a felügyelt vagy natív jelentések Összehasonlítás listájában található pillanatképek közül.

    A következő képernyőkép mutatja, hogyan kell választani egy pillanatképet az 'Összehasonlítandó' listából.

    Képernyőkép: Válasszon egy pillanatképet az Összehasonlítás listából.

A változásjelentés oszlopokat ((Diff)) ad hozzá az alapjelentéshez, amelyek az alappillanat-érték és az összehasonlító pillanatkép közötti különbséget mutatják. A natív típusú nézet diff jelentése a következőképpen nézhet ki:

Natív típusú Diff nézet képernyőképe.

A felső ablaktáblán a pillanatképben szereplő típusok száma és mérete látható, beleértve a típus által hivatkozott összes objektum méretét (Befogadó méret).

Blogok és videók

A processzor és a memória elemzése hibakeresés közben

Visual C++ Blog: Memória Profilozás a Visual C++ 2015-ben

Következő lépések

Ebben az oktatóanyagban megtanulta, hogyan gyűjthet és elemezhet memóriahasználati adatokat. Ha már elvégezte a profilkészítő bemutatóját, érdemes lehet megismerkednie a kód profilkészítési eszközökkel történő optimalizálásának általános megközelítésével.

Esettanulmány: Útmutató a kód optimalizálásához

Ebben az oktatóanyagban megtanulta, hogyan gyűjthet és elemezhet memóriahasználati adatokat hibakeresés közben. Érdemes lehet többet megtudni a memóriahasználat kiadási buildekben való elemzéséről a Performance Profiler használatával.