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

标签 c# asp.net performance memory-leaks unity-container

我在使用 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/

相关文章:

sql - 如果我期望读取多于写入,SQL 中的冗余列是否有益?

performance - 在 Haskell 中测试单例列表内容的最有效或惯用的方法?

c# - Mono 2.8.1 断言 mono_wsq_count (wsq) == 0

c# - 应用程序是否与给定的扩展关联?

javascript - Windows Azure云服务中的全局变量

javascript - 调用jquery中由代码隐藏函数设置的div类

c# - TCP Socket SendAsync 操作是否可以在不传输 BufferList 中的所有字节的情况下完成?

c# - 最大化系统托盘中的应用程序?

javascript - Telerik ASP.NET AJAX : How to get value of a data bound column, 客户端

php - 哪个部分需要更多时间,使用函数还是使用全局?