エンティティフレームワークのメモリが解放されません

c# entity-framework entity-framework-6

質問

私はEntity Framework 6.0.2、.Net 4.5.1で非常に単純なasp.net mvcアプリケーションを使用しています:

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

負荷テストを行うと、Out of Memory Exceptionが発生します。 ( tinyget -srv:localhost -port:<port> -uri:/home/index/ -threads:30 -loop:5000 )を実行します。パフォーマンスモニタでは、世代2のヒープが着実に成長するのを見ています。小さなループ値(例えば500)を使用すると、tinygetが停止するまでサイズが大きくなります。その後、ヒープサイズは同じままです(サーバーを停止した後、少なくとも20分間)。

私は間違って何をしていますか?

EDIT

そこで私はSimon Mouriersの提案を試み、EFコードを除外しました。それから私には記憶上の問題はありません。だから私は、おそらく、私はデバッグの代わりにリリースを使用すると、それは違いをもたらすだろうと思った。そしてそれはそうでした!しばらくしてメモリが解放され、サイトに負荷がかかる可能性があります。それから私はデバッグに戻って、さらに情報を得ることができるかどうかを確認し、デバッグモードでも問題はなくなりました。 FML、私はそれで一日働いて、今は私はもうそれを再現することはできません。

人気のある回答

あなたの場合、DbContextから継承する内部管理クラスは、IDisposableを実装する必要があり、LocalContextの内部に次のものを追加します:

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

disposeの呼び出しを明示的にオーバーライドしなければ、usingステートメントは親クラスと基底クラスを処分する必要がある間に、基本クラスに対してDispose()を呼び出すだけです。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ