【问题标题】:Memory Leaks when using Entity Framework and Windsor in an ASP.NET MVC application在 ASP.NET MVC 应用程序中使用 Entity Framework 和 Windsor 时出现内存泄漏
【发布时间】:2010-11-19 14:50:03
【问题描述】:

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

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

每个请求都会有更多的动态代理卡在内存中。如果有其他人设法让自己陷入这样的困境,并能给我提供摆脱困境的建议,将不胜感激。

【问题讨论】:

  • 显示代码。如何管理上下文生命周期?

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


【解决方案1】:

我已设法通过将 Windsor 容器的内核上的发布设置更改为:

_container.Kernel.ReleasePolicy = new NoTrackingReleasePolicy();

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

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

【讨论】:

    【解决方案2】:

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

    不看代码就不能多说。

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题。

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

          public override void ReleaseController(IController controller)
          {
              _container.Release(controller);
      
              var disposable = controller as IDisposable;
              if (disposable != null)
              {
                  disposable.Dispose();
              }
          }
      

      但是,我也在使用 Windsor 2.1,添加 _container.Release(controller) 并没有为我做任何事情。

      更新到 v3.1 后,它似乎可以工作了。

      希望这会有所帮助。

      附言ANTS Memory Profiler - 救命稻草!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-13
        • 2019-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-29
        • 2021-08-16
        • 1970-01-01
        相关资源
        最近更新 更多