【发布时间】:2014-01-27 11:09:25
【问题描述】:
我正在使用一个非常简单的 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,它会有所作为。它做到了!一段时间后内存被释放,我可以在网站上放置高负载。然后我切换回调试,看看我是否可以获得更多信息,并且......即使在调试模式下也没有问题了。 FML,我花了一天的时间,现在我无法再复制它了。
【问题讨论】:
-
我会说你没有做错任何事,这很可能是 EF 过度膨胀的代码库的问题。
-
我也找不到什么问题,只是觉得内存使用率没有下降很奇怪。
-
大概用
int count = 0; return View(count);替换代码并不能证明表明它的EF 不是其他东西的问题? -
您可能偶然发现了 EF 6 中的错误,请尝试降级到 EF 5。如果您可以确认这是 EF 5 和 6 之间的更改,我想 M$ 会很高兴听到来自你(参考。entityframework.codeplex.com/workitem/1605 - 最后的 cmets)
-
看起来你可能会遇到这个问题:entityframework.codeplex.com/workitem/1605
标签: c# entity-framework entity-framework-6