【发布时间】: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