实体框架 - 垃圾收集的Disposed ObjectContext

时间:2011-12-29 04:41:05

标签: entity-framework-4 memory-leaks

正如标题所暗示的那样,我最近发现当我试图追踪潜在的内存泄漏问题时,处置的objectcontext似乎不是垃圾收集。我在WPF应用程序中使用EF 4以及Prism和MVVM。当我开始寻找解决方案时,我碰到了这篇文章: http://connect.microsoft.com/VisualStudio/feedback/details/666304/memory-leakage-issue-in-entity-framework

我的所有objectcontexts都是在using块中使用的每个事务。我一直在假设对象上下文将被处理并最终被GC收集。显然只有它的第一部分发生了(我正在使用memprofiler)。有人可以指向我的资源或让我知道让GC收集已处置的对象内容的方法。

2 个答案:

答案 0 :(得分:3)

垃圾收集和Dispose是内存管理的两个不同方面。

Dispose是您班级的一种方法,您可以手动释放资源。

垃圾收集仅在.NET垃圾收集引擎决定运行时发生。通常建议您不要尝试修补此过程。垃圾收集器只会在某些启发式操作系统告诉您内存不足时运行,而今天的硬件可能永远不会(特别是如果您使用的是64位计算机)。

如果您想要强制收集,可以使用:

GC.Collect();

在这里阅读更多内容:

http://msdn.microsoft.com/en-us/library/xe0c2357.aspx

答案 1 :(得分:0)

我发现这个调用序列在强制GC运行时很有用。

GC.GetTotalMemory(false);
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.GetTotalMemory(true);

try
{
    Process curProc = Process.GetCurrentProcess();
    curProc.MaxWorkingSet = curProc.MaxWorkingSet;
}
catch (Exception)
{
}

但是,在阅读您链接的Microsoft Connect文章时,GC未运行不是该用户的问题。用户正在做的是在Session中粘贴一个实体类,这是一个可怕的举动,并且会因为答案(更改跟踪)中列出的原因而阻止父类处理。

会话存储对象应该是断开连接的类,而不是从上下文中检索的内容。只要您不这样做,当您从中检索到的任何内容的最后一次引用被释放时,您的对象上下文将被释放。