代码之家  ›  专栏  ›  技术社区  ›  Martin Booth

实体框架是否耗尽了我的内存?

  •  1
  • Martin Booth  · 技术社区  · 14 年前

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

    foreach (var c in context.Companies) { }

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

    注意:我知道内存不一定非要被释放,而且通常不会立即释放,我只是想让我的大脑放松,这里没有内存泄漏。

    谢谢

    2 回复  |  直到 14 年前
        1
  •  0
  •   Mitch Wheat    14 年前

    为什么不启动一个商用内存分析器(都有免费试用版)这样 MemProfiler ,比较两个快照并查看内存的去向。

    如果没有看到代码,很难判断是否存在内存泄漏。

        2
  •  1
  •   Yoshi    12 年前

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

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

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

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