Memoria di struttura di entità non rilasciata

c# entity-framework entity-framework-6

Domanda

Sto usando un'applicazione asp.net mvc molto semplice con Entity Framework 6.0.2, .Net 4.5.1:

public class HomeController : Controller
{
   public ActionResult Index()
   {
      int count;
      using (var db = new LocalContext())
      {
         count = db.Counters.Count();
      }
      return View(count);
   }
}

public class Counter
{
   public int Id { get; set; }
}

public class LocalContext : DbContext
{
   public DbSet<Counter> Counters { get; set; }
}

Se eseguo un test di caricamento, alla fine ottengo un'eccezione di memoria insufficiente. ( tinyget -srv:localhost -port:<port> -uri:/home/index/ -threads:30 -loop:5000 ). Nel monitor delle prestazioni vedo crescere la generazione 2. Se uso un valore di loop più piccolo (ad esempio 500), le dimensioni aumentano fino a quando il minuscolo si ferma. Quindi la dimensione dell'heap rimane la stessa (per almeno 20 minuti, dopo che ho fermato il server).

Che cosa sto facendo di sbagliato?

MODIFICARE

Così ho provato il suggerimento di Simon Mouriers e ho omesso il codice EF. Quindi non ho problemi di memoria. Così ho pensato, forse se uso Release invece di Debug, farà la differenza. E lo ha fatto! La memoria è stata rilasciata dopo un po 'e ho potuto caricare molto sul sito. Poi sono tornato a Debug per vedere se potevo ottenere più informazioni e ... anche in modalità Debug non ci sono più problemi. FML, ci ho lavorato un giorno e ora non riesco più a riprodurlo.

Risposta popolare

Nel tuo caso la classe gestita internamente che eredita da DbContext dovrebbe quindi implementare IDisposable e all'interno del LocalContext aggiungere quanto segue:

public void Dispose()
{
    this.Dispose(true);
    GC.SuppressFinalize(this);
}

protected virtual void Dispose(bool disposing)
{
     if (disposing)
     {
        // Manage any native resources.
     }
   //Handle any other cleanup.
}

Senza escludere in modo specifico la chiamata da eliminare, l'istruzione using chiama solo Dispose () rispetto alla classe base, mentre è necessario disporre del genitore e della base.



Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché