正如标题所暗示的那样,我最近发现当我试图追踪潜在的内存泄漏问题时,处置的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收集已处置的对象内容的方法。
答案 0 :(得分:3)
垃圾收集和Dispose是内存管理的两个不同方面。
Dispose是您班级的一种方法,您可以手动释放资源。
垃圾收集仅在.NET垃圾收集引擎决定运行时发生。通常建议您不要尝试修补此过程。垃圾收集器只会在某些启发式操作系统告诉您内存不足时运行,而今天的硬件可能永远不会(特别是如果您使用的是64位计算机)。
如果您想要强制收集,可以使用:
GC.Collect();
在这里阅读更多内容:
答案 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
中粘贴一个实体类,这是一个可怕的举动,并且会因为答案(更改跟踪)中列出的原因而阻止父类处理。
会话存储对象应该是断开连接的类,而不是从上下文中检索的内容。只要您不这样做,当您从中检索到的任何内容的最后一次引用被释放时,您的对象上下文将被释放。