【发布时间】:2011-08-26 01:18:18
【问题描述】:
我在使用 ASP.NET 应用程序时遇到了非常严重的内存问题。似乎每次页面加载时,页面的旧实例都不会从内存中删除。如果按 F5 十次,内存会为实例增加 10-20MB。在压力和性能测试期间,这会耗尽内存并且 Web 服务器会崩溃...
我运行了 ANTS 内存分析,它确认每次加载页面时,旧实例都保留在内存中。我所有的 ASP.NET 网页也都使用母版页。同样,如果我加载页面 10 次,则存在 10 个网页实例,以及 10 个母版页实例......
http://oi51.tinypic.com/21msy2g.jpg
查看 ants profiler 结果,您可以看到每次页面重新加载都会增加大约 320Kb 的内存,这只是网页,甚至没有考虑到母版页。我的应用程序是一个捕获应用程序的人寿保险应用程序,因此它大约有 30-40 页。所以你可以看到为什么这是一个大问题。
我将如何找出将页面保留在内存中的内容?我不知道从哪里开始... :\
我所有的页面都使用 Unity 和依赖注入来注册服务...不确定在 page_onUnload 之后是否需要取消注册这些服务。
编辑
好的,我已经设法找到了问题所在。页面未释放(GCollected)的原因是因为在卸载页面期间注册但从未取消注册的 Unity 服务实例。这就是我在页面上使用 Unity 的方式:
我通过公共属性注入服务
#region Services
[Dependency]
public ReviewReportService SummaryService { get; set; }
[Dependency]
public Portfolios.PortfolioService PortfolioService { get; set; }
#endregion
然后页面初始化,我做 Unity Buildup:
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
ApplicationContainer.BuildUp(this.Context, this);
}
现在很明显,当页面经历其正常的生命周期并调用 Unload 时,由于依赖注入引用,它无法卸载......我只是不确定如何取消注册服务(SummaryService、PortfolioService)
我尝试在 OnUnload 中调用以下命令,但它什么也没做:
ApplicationContainer.GetContainer(Context).Teardown(this);
【问题讨论】:
标签: c# asp.net performance memory-leaks unity-container