我在使用 ASP.NET 应用程序时遇到了严重的内存问题。似乎每次加载页面时,页面的旧实例都不会从内存中删除。如果按十次 F5,内存会增加 10-20MB 到实例。在压力和性能测试期间,这会耗尽内存并且 Web 服务器会崩溃...
我运行了 ANTS 内存分析,它确认每次加载页面时,旧的实例都保留在内存中。我的所有 ASP.NET 网页也都使用母版页。同样,如果我加载页面 10 次,则存在 10 个网页实例,以及 10 个母版页实例...
http://oi51.tinypic.com/21msy2g.jpg
查看 ants 分析器的结果,您可以看到每次重新加载页面都会增加大约 320Kb 的内存,这只是网页,甚至不考虑母版页。我的应用程序是一个捕获应用程序的人寿保险应用程序,因此它需要大约 30-40 页。所以你可以明白为什么这是一个大问题。
我将如何找出将页面保存在内存中的原因?我不知道从哪里开始...:\
我所有的页面都使用 Unity 和依赖注入(inject)来注册服务...不确定在 page_onUnload 期间我是否需要取消注册这些服务。
编辑
好的,我已经设法找到问题所在。页面未处理(GCollected)的原因是因为 Unity 服务实例已注册但在页面卸载期间从未取消注册。这就是我在页面上使用 Unity 的方式:
我通过公共(public)属性注入(inject)服务
#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 时,由于依赖项注入(inject)引用,它无法卸载...我只是不确定如何注销服务(SummaryService、PortfolioService)
我尝试在 OnUnload 中调用以下内容,但它什么也没做:
ApplicationContainer.GetContainer(上下文).Teardown(这个);
最佳答案
您在某处有一个对 Page 的静态引用,它无法被释放。
关于c# - ASP.NET 页面未从内存中删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7199087/