c # - .Net voksende hukommelsesproblem

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en applikation, der gør en masse tekstparsing. Efter hver passage spytter den nogle oplysninger ind i en database og fjerner al intern tilstand.


Mit problem er memeory allokeret i Windows Opgave Mgr/Resource Monitor fortsætter med at vokse og vokse. Jeg har lavet en profil ved hjælp af .Net Mem Profiler, og det ser ud til at det skal gå ned. Her er et skærmbillede fra profiler:


Indtast billedbeskrivelse her


Men i opgaven Mgr efter hvert passager øges hukommelsen, det private arbejdssæt. Jeg vil gerne have hukommelsen til at vokse, når den bruges, og derefter vende tilbage til et normalt niveau efter hver passage, på den måde kunne jeg holde denne ting kørende.


Eventuelle råd om hvad man skal se efter eller nogen ideer, hvad der forårsager dette?

Bedste reference


Nogle ting at kontrollere er:



  1. Hændelseshåndterer, der holder objekter i live, skal du sørge for, at hvis objektet, der abonnerer på en begivenhed, ikke går ud, før objektet offentliggør begivenheden om, at den afmelder sig fra begivenheden for at forhindre, at forlagsobjektet henvises til det.

  2. Sørg for, at du ringer bort på ethvert objekt, der implementerer IDisposable. Generelt indeholder genstande, der implementerer IDisposable, ressourcer, der kræver særlig rydning.

  3. Hvis du henviser til eventuelle com objekter, skal du sørge for at frigive dem korrekt.



Du skal aldrig ringe GC.Collect() inden for produktionskode.

Andre referencer 1


Opgave Mgr er ikke en præcis repræsentation af den hukommelse, din ansøgning rent faktisk bruger. Det er mere en repræsentation af, hvor meget hukommelsesvinduer har tildelt eller planlagt til din ansøgning. Hvis du har brug for mere, kan Windows udvide dette nummer, men hvis din app har brug for mindre, kan Windows muligvis ikke tildele denne hukommelse til et andet program rent faktisk har brug for det ..


Jeg tror, ​​hvad du har ovenfor, er en ret præcis repræsentation af, hvad din ansøgning rent faktisk gør (dvs. det er ikke lækker).

Andre referencer 2


Dette tvinger .NET til at samle alle ubrugte objekter fra hukommelsen og derfor genvinde noget af det:


GC.Collect();
GC.WaitForPendingFinalizers();

Andre referencer 3


Hvis du har en hukommelseslækage, kan du bruge SOS-fejlfindingsudvidelsen til at forsøge at finde den. Denne artikel er også et meget godt eksempel og lidt mere komplet så hvad mit svar vil omfatte. [8] [9]


Du kan bruge dette i enten VS eller WinDbg, og den eneste forskel er, hvordan du indlæser dll'en. For Visual Studio skal du først aktivere uhåndteret fejlsøgning i fejlfindingstaben for dine projektets egenskaber. Når det kommer tid til at indlæse det, skal du bruge .load SOS.dll i Immediate Window. For WinDbg skal du enten åbne den eksekverbare eller vedhæftede fil til processen, og for at indlæse den skal du bruge .loadby sos clr til .NET 4 eller .loadby sos mscorwks til 2 eller 3,5.


Når du har ladet programmet køre et stykke tid, skal du sætte det pauset (bryde alle). Nu kan du indlæse SOS. Efter succes skal du indtaste !dumpheap -stat. Dette vil angive, hvor meget hukommelse hver klasse bruger. Hvis det ikke er nok at finde lækagen, går den anden artikel, jeg linker, ind i mere dybde om, hvordan man finder hukommelseslekken.

Andre referencer 4


En måde at løse dette på er at opdele dit arbejde i separate eksekverbare programmer. Når et program gennemfører sit arbejde og slutter, bliver hele sin hukommelse genindvundet af systemet.