12. august 2009 - 13:06Der er
6 kommentarer og 1 løsning
Memory leak i forbindelse med entity framework/linq
Jeg har et større memory leak i nedenstående kodeuddrag, som jeg ikke ved hvordan jeg kan rette. Når jeg indsætter koden i et loop stiger hukommelsesforbruget fra ca 40MB til 100MB + i løbet af få minutter. Når jeg fjerner "BFile = query.First(); " forsvinder leaket.
... ... Entities context = (Entities) database.GetEntities(ctx); using (context) { var query = from f in context.BFile select f; BFile bf = query.First(); } context.Dispose();
Jeg prøver lige at poste hele min testmetode. Leaket er kun tilstede når "query.First()" kaldes.
public void TestDB{ while (true){ try{ Context ctx = new Context("user", "passwd"); Database database = new Database(); Entities context = (Entities) database.GetEntities(ctx);
using (context){ var query = from f in context.BFile select f; BFile bf = query.First(); } context.Dispose(); } catch (Exception ex){ Console.WriteLine(ex.Message); } } }
Hvad er meningen med den kode ? At du vil løbe tør for ram ?
Du har vel også en masse ting som ikke nøvedigvis bliver disposed med det samme og det venter jo så på at GC kommer til ... og det sker jo sådan set kun når den har lyst ... eller mangler ram mener jeg.
Der er tidligere opstået en fejl i den underliggende Oracle Devart når databasen tilgås hurtigt flere gange i træk, denne test skal sikre at fejlen er rettet. Man kan se at GC kører periodisk, og at der deallokeres hukommelse, men forbruget er stigende. Det samme gør sig gældende for de servere det hoster løsningen, man kan se at hukommelsesforbruget løbende stiger når databasen tilgås.
Tror du bliver nød til at smide flere debug ting ind ...
Jeg har en stor db ... og serveren bruger alt ram ... dvs SQL'en gør ... og den laver intet være fri ... så det er vel meget normalt at Oracle databasen og bliver alt ram.
Men stiger forbruget konstant ... dvs indtil du får en OutOfMemoryException ?
Men det lader jo stadig til at du måske har en del ting som ikke bliver Disposed med det samme de faktisk burde.
Det betyder ikke det store at databasen sluger meget ram, da den har sin egen dedikerede server. Problemet ligger i at de server der kalder databasen bruger mere og mere ram indtil de til sidst får en OutOfMemoryException. Vi har sporet problemet til selve database kaldene, som nærmest er identiske med testkoden. Hvis vi fjerner koden inden for "using" blokken er hukommelsesforbruget konstant
Memory leaket er fundet... Det er en fejl i den anvendte data provider
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.