c# - Entity Framework 内存未释放

标签 c# entity-framework entity-framework-6

我正在使用一个非常简单的 asp.net mvc 应用程序和 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; }
}

如果我对其进行负载测试,我最终会遇到内存不足异常。 (tinyget -srv:localhost -port:<port> -uri:/home/index/ -threads:30 -loop:5000)。在性能监视器中,我看到第 2 代堆稳步增长。如果我使用较小的循环值(比如 500),大小会增加直到 tinyget 停止。然后堆大小保持不变(至少 20 分钟,之后我停止了服务器)。

我做错了什么?

编辑

所以我尝试了 Simon Mouriers 的建议并省略了 EF 代码。那么我没有内存问题。所以我想,如果我使用 Release 而不是 Debug,也许会有不同。它做到了!一段时间后内存被释放,我可以在站点上施加高负载。然后我切换回 Debug 以查看是否可以获得更多信息并且......即使在 Debug 模式下也没有问题。 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.
}

没有特别覆盖对处置的调用,using 语句只会对基类调用 Dispose(),而您需要处置父类和基类。

关于c# - Entity Framework 内存未释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21379290/

相关文章:

c# - 使用 Entity Framework 获取特定 Id 的下一个和上一个实体?

c# - 使用 EntityFramework 时更新导航属性?

c# - 将实体列表保存到数据库 - MVC

linq - 如何在linq中格式化十进制值

c# - 在不同的程序集上分布 Entity Framework 模型

entity-framework - 如何使用 Entity Framework Core 2.1 执行 SqlQuery?

c# - LookupAccountSid 每次调用花费 +600 毫秒

c# - 从 C# 中的 MailItem 获取命名的 MAPI 属性

c# - 将空值转换为字符串的函数

c# - PgAdmin Import/Export 没有使用 Entity Framework 保留外键