Entity framework 4 实体框架-垃圾未收集已处置的ObjectContext

Entity framework 4 实体框架-垃圾未收集已处置的ObjectContext,entity-framework-4,memory-leaks,Entity Framework 4,Memory Leaks,正如标题所示,我最近在试图追踪潜在内存泄漏问题时发现,已处理的objectcontext似乎不会被垃圾收集。我在WPF应用程序中与Prism和MVVM一起使用EF4。当我开始四处寻找解决方案时,我偶然发现了这篇文章: 所有my ObjectContext都是在using块中使用的每个事务。我一直假设objectcontext将被释放,并最终由GC收集。显然,只有第一部分发生了(我使用的是memprofiler)。有人能给我指出一个资源或告诉我一种让GC收集已处理的ObjectContext的方

正如标题所示,我最近在试图追踪潜在内存泄漏问题时发现,已处理的objectcontext似乎不会被垃圾收集。我在WPF应用程序中与Prism和MVVM一起使用EF4。当我开始四处寻找解决方案时,我偶然发现了这篇文章:


所有my ObjectContext都是在using块中使用的每个事务。我一直假设objectcontext将被释放,并最终由GC收集。显然,只有第一部分发生了(我使用的是memprofiler)。有人能给我指出一个资源或告诉我一种让GC收集已处理的ObjectContext的方法吗。

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

Dispose是类上的一个方法,您可以在其中手动释放资源

垃圾收集仅在.NET垃圾收集引擎决定运行时发生。通常建议您不要尝试修补此过程。垃圾收集器只有在某些启发式提示您内存不足时才会运行,而在今天的硬件上,内存不足可能永远不会运行(特别是在64位机器上)

如果您想玩强制收集的游戏,您可以使用:

GC.Collect();
请在此处阅读更多信息:


我发现这个调用序列在强制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未运行不是该用户的问题。该用户所做的是在
会话
中粘贴一个实体类,这是一个可怕的举动,将阻止父类由于答案(更改跟踪)中概述的原因被处置


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

我理解其中的区别。无论如何,谢谢你指出这一点。明确回答了如何强制GC运行以收集已处置的objectcontext的问题。但从本质上讲,我试图了解EF在所有企业应用程序中是否都会发生这种情况,以及它们是如何管理应用程序中的内存的。也许我应该这样回答这个问题。我的回答到底是如何混淆GC和Dispose的?我在回答他关于让GC开火的问题。我上面的答案已经澄清了GC和Dispose之间的区别,因此我不觉得有必要重复解释。主要是你的最后一句话,你提到持有“参考”是为了阻止某些东西被处置。此术语通常用于表示对对象实例的“引用”将阻止GC。说对某物的引用阻止了它被释放似乎有些奇怪,因为实际上您首先需要一个引用来调用
Dispose
(在终结器中调用它时除外)。然而,仔细阅读,我不确定你的答案是否对此感到困惑。但后来的读者可能会这么想。