Avatar billede henrik_k Nybegynder
12. august 2009 - 13:06 Der 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();
Avatar billede Syska Mester
12. august 2009 - 14:59 #1
Uden at vide hvad din kode gør er det ik' nemt ...

men:
  var query = from f in context.BFile select f;
  BFile bf = query.First(); 
burde kunne skrives som:
BFile bf = context.BFile.First();

hvis jeg ik' husker helt galt ...

Men der må jo være en masse objekter du ikke får Disposed eller en masse string concat ....

// ouT
Avatar billede henrik_k Nybegynder
12. august 2009 - 15:46 #2
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);
    }
  }
}
Avatar billede Syska Mester
12. august 2009 - 16:03 #3
øhhh ...

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.

Hvad er det præcise formål med den her test ?

// ouT
Avatar billede henrik_k Nybegynder
12. august 2009 - 18:01 #4
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.
Avatar billede Syska Mester
12. august 2009 - 21:28 #5
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.

// ouT
Avatar billede henrik_k Nybegynder
12. august 2009 - 23:09 #6
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
Avatar billede henrik_k Nybegynder
13. august 2009 - 08:26 #7
Memory leaket er fundet... Det er en fejl i den anvendte data provider
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester