FaN*_*NIX 5 c# asp.net performance memory-leaks unity-container
我一直在使用ASP.NET应用程序时出现非常糟糕的内存问题.似乎每次页面加载时,旧的前一页面实例都不会从内存中删除.如果按F5十次,内存会为实例添加10-20MB.在压力和性能测试期间,这将最大化内存,Web服务器将崩溃...
我运行了ANTS内存分析,它确认每次加载页面时,旧的instane都会保留在内存中.我的所有ASP.NET网页也使用Master页面.同样,如果我加载页面10次,则存在10个网页实例,以及10个主页面实例...
http://oi51.tinypic.com/21msy2g.jpg
查看蚂蚁分析器结果,您可以看到每个页面重新加载大约320Kb到内存,这就是网页,甚至没有考虑到母版页.我的应用程序是一个捕获应用程序的人寿保险应用程序,所以它通过大约30-40页.所以你可以看出为什么这是一个大规模的问题.
我怎样才能找到将页面保留在内存中的最新信息?我不知道从哪里开始...:\
我的所有页面都使用Unity和Dependency注入来注册服务......不确定在page_onUnload期间是否需要取消注册这些服务.
编辑
好的,我已成功追踪问题了.页面未被处理(GCollected)的原因是因为在卸载页面期间已注册但未注册的Unity服务实例.这就是我在我的页面上使用Unity的方式:
我通过公共财产注入服务
#region Services
[Dependency]
public ReviewReportService SummaryService { get; set; }
[Dependency]
public Portfolios.PortfolioService PortfolioService { get; set; }
#endregion
Run Code Online (Sandbox Code Playgroud)
然后页面init,我做Unity Buildup:
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
ApplicationContainer.BuildUp(this.Context, this);
}
Run Code Online (Sandbox Code Playgroud)
现在显然当页面经历其正常的生命周期并调用Unload时,由于依赖注入引用而无法卸载...我只是不确定如何取消注册服务(SummaryService,PortfolioService)
我尝试在OnUnload中调用以下内容,但它什么也没做:
ApplicationContainer.GetContainer(上下文).Teardown(本);
该问题是由 UNITY 及其 LifeTimeManager 引起的。我必须使用不同的统一 LifeTimeManager,它基本上在每次页面构建时返回一个新容器。在页面卸载时,对容器调用拆解并将其释放,这会释放指向注入属性的所有链接。这解决了我的问题:)