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


Memóriahasználat mérése Visual Studio (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 Memory Usage eszközben, a Visual Studio hibakeresővel szabályozhatja az alkalmazás végrehajtásának módját 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.

Borravaló

A GitHub Copilot Profiler Agent segítségével AI-alapú útmutatást kaphat a memórianyomok gyűjtéséhez és elemzéséhez.

Fontos

A hibakeresővel integrált diagnosztikai eszközök támogatottak .NET Visual Studio fejlesztéséhez, beleértve az ASP.NET, a ASP.NET Core, 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 Studio hibakereséséhez használni kívánt project, é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ésWindowsDiagnosztikai 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.

    Képernyőkép a Diagnosztikai eszközök ablakról, amelyen a Memóriahasználat eszköz van kiválasztva az Eszközök kijelölése legördülő listában.

    Képernyőkép a Diagnosztikai eszközök ablakról, amelyen a Memóriahasználat eszköz van kiválasztva az Eszközök kijelölése legördülő listában.

  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.

    Képernyőkép a Diagnosztikai eszközök összefoglalás lapról, amelyen a Memóriahasználat idővonal grafikonja és a folyamatmemória diagram látható.

    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.

    Képernyőkép a Memóriahasználat eszköztárról, a Memóriahalom profilkészítés gomb kiemelésével a pillanatképek engedélyezése natív vagy vegyes módú alkalmazásokhoz.

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

    Képernyőkép a Diagnosztikai eszközök összefoglalás lapról, amelyen a Memóriahasználat idővonal grafikonja és a folyamatmemória diagram látható.

    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.

    Képernyőkép a Memóriahasználat eszköztárról, a Memóriahalom profilkészítés gomb kiemelésével a pillanatképek engedélyezése natív vagy vegyes módú alkalmazásokhoz.

    Leállítás (billentyűparancs: ShiftF5) é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.)

    Képernyőkép a Memóriahasználat összegzése eszköztárról a Pillanatkép készítése gombbal.

    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.

Képernyőkép a Memóriahasználat összegző tábláról, amely két pillanatképet jelenít meg az objektumok oszlopaival, a halommérettel és azok különbségeivel.

Az oszlop neve a project tulajdonságokban vá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 a pillanatkép készítésekor .NET vagy natív memóriában lévő objektumok számát.

  • A Heap Size (Diff) oszlop megjeleníti a .NET és a natív halmok bájtjainak számát

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éseMemó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.felügyelt típusú jelentés

Jegyzet

.NET kód esetén: a Nézet részletei ikon (Az Objektumtípus oszlop példányikonja) csak a debugger-integrált Memóriahasználat eszköz használatakor vagy amikor megnyit egy memóriakupac pillanatképet, és kiválasztja a Felügyelt memória hibakeresése lehetőséget é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 egy objektum 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.felügyelt típusú jelentés

Jegyzet

.NET kód esetén a View Instances ikon (Az Objektumtípus oszlop példányikonja) csak akkor érhető el, ha a hibakeresővel integrált Memóriahasználati eszközt használja, vagy amikor megnyit egy halom pillanatképet, és kiválasztja a Felügyelt memória hibakeresése lehetőséget.

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 egy objektum 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.

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 Részletek megtekintése ikonra az objektumtípus mellett.

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

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.

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.Példányok nézet a Memóriahasználat eszközben

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.

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.

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

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

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

  • A kiválasztott típus melletti Részletek megtekintése ikont választva megjelenítheti a pillanatképben a kiválasztott 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.

  • 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 Stacks lehetőséget a kiválasztott típus kiosztási veremének megtekintéséhez.

    Stacks nézet 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.

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.Memóriahasználati betekintés

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

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.

A Event Handler Leaks szakasz, amely Visual Studio 2022 17.9-es előzetes verzióban érhető el, olyan memóriavesztéseket mutat be, amelyek akkor fordulhatnak elő, ha egy objektum feliratkozik egy másik objektum eseményére. Ha az esemény kiadója túléli az előfizetőt, az előfizető továbbra is életben marad, még akkor is, ha nincs rá más hivatkozás. 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.memóriahasználat eszköz natív betekintési nézetét

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 Memóriahasználat összegző tábláról egy pillanatképcellában kiemelt módosítási hivatkozással.

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

    Képernyőkép egy Memóriahasználati jelentés Hasonlító adatok legördülő listájáról, amelyen az összehasonlításhoz elérhető pillanatképek láthatók.

    Képernyőkép egy Memóriahasználati jelentés Hasonlító adatok legördülő listájáról, amelyen az összehasonlításhoz elérhető pillanatképek láthatók.

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ípusok Különbségi nézetének képernyőképe. Natív típusokKülönbségi nézet

Natív típusok Különbségi nézetének képernyőképe. Natív típusokKülönbségi nézet

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

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 hibakeresés közben. Íme néhány javasolt következő lépés:

  • A memóriahasználat kiadási buildekben való elemzésével kapcsolatban lásd : Memóriahasználat elemzése a teljesítményprofilozóban.
  • A kód profilkészítési eszközökkel történő optimalizálásának általános megközelítéséről az Esettanulmány: Kezdő útmutató a kód optimalizálásához című témakörben olvashat.
  • Az AI-alapú profilkészítési útmutatásért lásd: Az alkalmazás profilkészítése GitHub Copilot Profiler-ügynökkel.
  • Az összes profilkészítési eszköz áttekintéséhez tekintse meg az Első pillantás a profilkészítési eszközök áttekintésére.