ASP.NET页面未从内存中删除

时间:2011-08-26 01:18:18

标签: 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

然后在页面init,我做Unity Buildup:

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);

                    ApplicationContainer.BuildUp(this.Context, this);
            }

现在显然当页面经历正常的生命周期并调用Unload时,由于依赖注入引用而无法卸载...我只是不确定如何取消注册服务(SummaryService,PortfolioService)

我尝试在OnUnload中调用以下内容,但它什么也没做:

ApplicationContainer.GetContainer(上下文).Teardown(本);

4 个答案:

答案 0 :(得分:1)

你有一个静态的引用页面,它无法处理。

答案 1 :(得分:0)

我肯定会从取消注册服务开始。我已经看到了由于这个问题导致的大量内存泄漏(尽管在该实例中没有使用统一)。

另外,环顾四周,看看你是否正在使用页面变量,使其不被垃圾收集。

答案 2 :(得分:0)

我会检查页面/母版页上是否存在静态集合 只需在整个项目中搜索单词static(C#)或shared(VB)

答案 3 :(得分:0)

问题是由UNITY及其LifeTimeManager引起的。我不得不使用一个不同的统一LifeTimeManager,它基本上每次页面进行累积时返回一个新的容器。在页面的UnLoad上,在容器上调用拆解并将其处理掉,这将释放注入属性的所有链接。这解决了我的问题:)