在ASP.NET MVC应用程序中使用Entity Framework和Windsor时内存泄漏

时间:2010-11-19 14:50:04

标签: asp.net-mvc entity-framework castle-windsor

我无法让windsor容器和实体框架协同工作,这可能是由于我自己介绍的一个问题,但最终的结果是我的内存泄漏很严重。

我的应用程序设置了EDMX和存储库和服务,并且在我使用的windsor配置文件中将对象和文本设置为perwebrequest。但是,当我查看ANTS内存分析器中的内存使用情况时,我发现尽管确认已调用Dispose,但仍然将对象上下文缓存保留为缓存的引用。

每个请求更多动态代理都会卡在内存中。如果有其他人设法让自己陷入这样的泡菜中并且可以为我提供建议,那么我将非常感激。

3 个答案:

答案 0 :(得分:4)

我设法通过将windsor容器的内核上的释放设置更改为:

来追踪并解决问题
_container.Kernel.ReleasePolicy = new NoTrackingReleasePolicy();

虽然windsor容器调用perwebrequest组件的dispose方法,但它仍然挂在它们的引用上,这防止它们被垃圾收集。

在这种情况下,它持有引用的对象是ObjectContext类型。不幸的是,尽管处理了这个对象,但是这个对象中缓存的所有动态代理仍然有效地意味着我的数据库的副本(或者至少我正在访问的部分)被添加到内存中,每个请求都会导致它增加。

答案 1 :(得分:2)

您可能没有正确处理对象。尝试使用“使用”块。

如果没有看到代码,就不能说更多。

答案 2 :(得分:1)

我遇到了同样的问题。

经过调查,似乎我在控制器工厂中错过了对_container.Release(控制器)的调用:

    public override void ReleaseController(IController controller)
    {
        _container.Release(controller);

        var disposable = controller as IDisposable;
        if (disposable != null)
        {
            disposable.Dispose();
        }
    }

然而,我也在使用Windsor 2.1并添加_container.Release(控制器)对我没有任何作用。

更新到v3.1之后似乎有效。

希望这有帮助。

P.S。 ANTS Memory Profiler - 救生员!