【问题标题】:ASP.NET Pages not removed from memoryASP.NET 页面未从内存中删除
【发布时间】: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


    【解决方案1】:

    您在某处有对该页面的静态引用,并且无法处理它。

    【讨论】:

    • 如何确定我是否对页面有静态引用?有什么方法可以识别引用它的对象吗?
    【解决方案2】:

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

    另外,环顾四周,看看您是否正在使用 page 变量以防止其被垃圾收集。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        问题是由 UNITY 和 LifeTimeManager 引起的。我不得不使用不同的统一 LifeTimeManager,它基本上每次页面构建时都会返回一个新容器。在页面的 UnLoad 中,对容器调用了 teardown 并将其释放,这会释放所有指向注入属性的链接。这解决了我的问题:)

        【讨论】:

          猜你喜欢
          • 2013-06-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-29
          相关资源
          最近更新 更多