【问题标题】:Entity Framework keeps data in memory even though it's disposed实体框架将数据保留在内存中,即使它已被释放
【发布时间】:2013-02-17 13:09:42
【问题描述】:

我目前正在使用 EF,因为我想在一个新项目中使用它,但我遇到了一个我无法向自己解释的小内存问题。

情况如下:

我打开一个包含显示数据的网格的新表单。在OnLoad 事件中,我使用实体框架模型从数据库中获取数据:

   Using db As New OfficeDatabaseModelContainer(DatabaseManager.Instance.ProductiveConnectionString)
        Dim groupList As List(Of String) = New List(Of String)
        groupList.Add("Active")
        GridUtils.AssignObjectListToGrid(grdUser, db.User, GetType(User), groupList)
   End Using

这段代码增加了大约 10MB 的内存(由于测试,我从数据库中读取了 15k 行)。 当我关闭表单时,我以编程方式处理表单以及包含数据的网格。但是数据库模型上下文的 10MB 保留在内存中。即使它应该在我在 using 块中获取数据时被处置。

如果我打开表单 10 次,它总是将新的数据量添加到内存中(这是有道理的),但不会清除已处理的数据。

我什至尝试在关闭表单时致电GC.Collect(),但也无济于事。

内存泄漏不是来自网格之类的。我证明了使用以下代码:

Dim userList = DatabaseManager.Instance.ProductiveDatabase.User
Dim groupList As List(Of String) = New List(Of String)
groupList.Add("Active")
GridUtils.AssignObjectListToGrid(grdUser, userList, GetType(User), groupList)

这样我在单例类中就有了数据库模型的静态属性。其中ProductiveDatabase 是模型的实例,而用户代表表用户。我可以尽可能频繁地调用表单,因为我希望内存使用量保持在 ~10MB,这非常有意义,因为我总是以这种方式对相同对象使用相同的引用。

一定是我做错了什么。我已经在互联网上搜索了模型的使用情况并尽可能降低内存使用量。似乎这里的最佳做法是在使用模型时使用 using 块。

【问题讨论】:

  • AssignObjectListToGrid 会发生什么,特别是:您是否与任何事件相关联?而且,您是否使用内存分析器对此进行了调查? Windows 任务管理器并不是解决内存问题的最佳工具。无论如何,内存分析器是值得推荐的,因为它会显示留在内存中的对象。

标签: vb.net entity-framework memory using


【解决方案1】:

在您在代码中处理完该列表后,我会处理该列表 实际上处置任何 IDisposable 的对象

groupList.dispose

【讨论】:

  • 基本上这就是我正在做的事情。 db 模型及其上下文应该被释放,因为它在 using 块内。 groupList 不包含任何数据,它只是一个字符串列表,它告诉网格将其自身与提供的内容进行分组。当 from 关闭时,将放置网格。正如我所写,如果我使用 db 模型作为静态属性,我没有内存问题。
【解决方案2】:

第一次调用 dbcontext 将构建所有配置等,并将其静态存储在进程内存中。要确认这一点,请尝试添加第 2 次和第 3 次调用,并且内存占用应该保持一致。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 2011-08-27
    • 2022-08-06
    相关资源
    最近更新 更多