Mémoire d'infrastructure d'entité non libérée

c# entity-framework entity-framework-6

Question

J'utilise une application très simple asp.net mvc avec 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 je fais un test de charge dessus, je finis par obtenir une exception de mémoire insuffisante. ( tinyget -srv:localhost -port:<port> -uri:/home/index/ -threads:30 -loop:5000 ). Dans Performance Monitor, la génération 2 de Heap ne cesse de croître. Si j'utilise une valeur de boucle plus petite (disons 500), la taille augmente jusqu'à ce que tinyget s'arrête. Ensuite, la taille du tas reste la même (pendant au moins 20 minutes, après quoi j'ai arrêté le serveur).

Qu'est-ce que je fais mal?

MODIFIER

J'ai donc essayé la suggestion de Simon Mouriers et laissé de côté le code EF. Ensuite, je n'ai pas de problèmes de mémoire. Alors j'ai pensé, peut-être que si j'utilisais Release au lieu de Debug, cela ferait une différence. Et ça l'a fait! La mémoire a été libérée après un certain temps et je pouvais mettre une charge élevée sur le site. Ensuite, je suis retourné à Debug pour voir si je pouvais obtenir plus d’informations et ... même en mode Debug, plus aucun problème. FML, j'ai travaillé un jour dessus et maintenant je ne peux plus le reproduire.

Réponse populaire

Dans votre cas, la classe gérée en interne qui hérite de DbContext devrait alors implémenter IDisposable et à l'intérieur du LocalContext, ajoutez ce qui suit:

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

Sans ignorer spécifiquement l'appel à disposer, l'instruction using ne fera qu'appeler Dispose () contre la classe de base, alors que vous devez disposer du parent et de la base.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi