Asp.net mvc 在ASP.NET MVC应用程序中使用实体框架和Windsor时内存泄漏
我很难让windsor容器和实体框架一起工作,这可能是由于我自己介绍的一个问题造成的,但最终的结果是导致了严重的内存泄漏 我用EDMX和存储库和服务设置了我的应用程序,这些存储库和服务以及objectcontext在我使用的windsor配置文件中设置为perwebrequest。但是,当我查看ANTS memory profiler中的内存使用情况时,我发现尽管确认已调用Dispose,但对象上下文缓存仍作为缓存的引用保留在内存中Asp.net mvc 在ASP.NET MVC应用程序中使用实体框架和Windsor时内存泄漏,asp.net-mvc,entity-framework,castle-windsor,Asp.net Mvc,Entity Framework,Castle Windsor,我很难让windsor容器和实体框架一起工作,这可能是由于我自己介绍的一个问题造成的,但最终的结果是导致了严重的内存泄漏 我用EDMX和存储库和服务设置了我的应用程序,这些存储库和服务以及objectcontext在我使用的windsor配置文件中设置为perwebrequest。但是,当我查看ANTS memory profiler中的内存使用情况时,我发现尽管确认已调用Dispose,但对象上下文缓存仍作为缓存的引用保留在内存中 每一个请求都会有更多的动态代理卡在内存中。如果其他任何人已经设
每一个请求都会有更多的动态代理卡在内存中。如果其他任何人已经设法让自己陷入这样的困境,并能给我建议摆脱困境,我们将不胜感激。您可能没有正确处理对象。尝试使用“使用”块
如果看不到代码,我无法说更多。我已通过将windsor容器内核上的发布设置更改为:
_container.Kernel.ReleasePolicy = new NoTrackingReleasePolicy();
看起来,尽管windsor容器调用perwebrequest组件的dispose方法,但它仍然挂起这些组件的引用,从而防止它们被垃圾收集
在本例中,它持有引用的对象是ObjectContext类型。不幸的是,尽管处理了该对象,但缓存在该对象中的所有动态代理仍然有效地保留着,这意味着每次请求都会向内存中添加一份数据库副本(或至少是我正在访问的部分),从而导致其爬升。我也遇到了同样的问题 经过调查,我似乎错过了对控制器工厂中的_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后,它似乎可以工作
希望这有帮助
p、 美国蚂蚁记忆档案器-救生员 显示代码。如何管理上下文生存期?