Entity framework memoria no liberada

c# entity-framework entity-framework-6

Pregunta

Estoy usando una aplicación mvc asp.net muy simple 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; }
}

Si hago una prueba de carga en él, finalmente obtengo una excepción de memoria insuficiente. ( tinyget -srv:localhost -port:<port> -uri:/home/index/ -threads:30 -loop:5000 ). En Monitor de rendimiento veo que la generación 2 Heap crece constantemente. Si uso un valor de bucle más pequeño (por ejemplo, 500), el tamaño aumenta hasta que se detiene tinyget. Luego, el tamaño del montón permanece igual (durante al menos 20 minutos, después de eso detuve el servidor).

¿Qué estoy haciendo mal?

EDITAR

Así que intenté la sugerencia de Simon Mouriers y dejé fuera el código de EF. Entonces no tengo problemas de memoria. Así que pensé, tal vez si utilizo Liberar en lugar de Depurar, marcará la diferencia. Y lo hizo! La memoria se liberó después de un tiempo y pude poner mucha carga en el sitio. Luego volví a la función de depuración para ver si podía obtener más información y ... incluso en el modo de depuración ya no hay problemas. FML, trabajé un día en él y ahora ya no puedo reproducirlo.

Respuesta popular

En su caso, la clase administrada internamente que hereda de DbContext necesitará implementar IDisposable y dentro de LocalContext agregue lo siguiente:

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

Sin anular específicamente la llamada a disponer, la declaración de uso solo llamará a Dispose () contra la clase base, mientras que usted necesita deshacerse de la base y la principal.



Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué