实体框架耗尽了我的记忆吗?

时间:2010-10-21 01:09:23

标签: c# .net entity

我正在努力弄清楚为什么我写的基本应用程序中的内存使用量过多。我正在尝试创建一个包含大约25000个节点的动态MVC站点地​​图,并使用实体框架从数据库表中填充它(尽管这个细节可能并不重要)

我有以下代码:

foreach (var c in context.Companies) { }

在此行之前有一个断点,webdev.webserver40.exe消耗大约50mb。之后约250mb。我试过处理上下文,让上下文超出范围;每次调用GC.Collect(),但我似乎无法恢复此内存。

NB我知道内存不一定是,并且通常不会立即释放,我只是想让我放心,这里没有内存泄漏。

由于

2 个答案:

答案 0 :(得分:1)

除了我的上下文是实体框架上下文,数据来自数据库之外,我的代码几乎完全相同。看起来这是一个“内存使用峰值”而不是永久性的“泄漏”,因为整个内存消耗最终会回到合理的正常水平。但这仍然不是一件好事。

它似乎正在将整个列数据(包括我的大型二进制列数据)加载到内存中。保留数据直到“范围”结束(例如,内容超出范围)。在循环时,一些数据在垃圾收集中存活下来,被提升到下一代,这导致保留期更长(在我的情况下,内存在大约10分钟后释放)。

我尝试过各种各样的事情,但我认为这只是我们必须接受的一种行为。

在我的特定情况下,我使用二进制序列化来保存数据库中的对象状态。我还没有解决这个问题,但我减少内存使用量峰值的方法是重构代码,这样我就不会使用二进制序列化,而是将原始数据保存到数据库表列中,并简单地为代码中的对象赋值。下一个修复级别是使用“延迟初始化”,然后使用缓存等。

在您的站点地图中,您可以“分段”视图并仅加载节点的子集。

答案 1 :(得分:0)

为什么不启动一个商用内存分析器(都有免费试用版),例如MemProfiler,比较2个快照,看看你的记忆去了哪里。

如果没有看到您的代码,很难说您是否有内存泄漏。