【问题标题】:Identifying memory problems in an ASP.NET application识别 ASP.NET 应用程序中的内存问题
【发布时间】:2010-09-24 16:13:01
【问题描述】:

我有一个 ASP.NET 应用程序正在运行,并且在生产机器上它使用大约 450MB 的 RAM,但是,它不应该使用太多,而且它似乎随着时间的推移而增加,所以看起来可能有泄漏或至少没有正确释放的东西。

我用 PerfMon 看了一下,GC Gen2 中有 416MB。

有人知道它在内存中保存了什么吗?我可以抓住 dotTrace/ANTS 并以某种方式将它附加到我的 IIS(6 - 在 Windows Server 2003 上) - 还是有更好的方法? :-)

谢谢。

【问题讨论】:

    标签: asp.net iis memory profiling


    【解决方案1】:

    在循环中更新一堆字符串的经典问题可能会导致您看到的问题,因为为新字符串分配了大量内存而没有释放它们。您是否在适当的地方使用 StringBuilder?

    【讨论】:

    • 好点。我想这种情况可能有几个。自从我发布以来,仍然没有机会测试这些东西。
    【解决方案2】:

    观看 Tess 的 this TecheEd 演示会是一个好的开始。

    她演示了使用 adplus 对消耗大量 RAM 的 ASP.NET 应用程序进行转储,然后将该转储加载到 WinDbg 中进行分析。使用 WinDbg 中的 !gcroot 命令查找意外的根并从那里开始。她建议不要在缓存或会话中存储包含对其他对象的引用的复杂类型。

    【讨论】:

    • 演示文稿真的很有用 - 我已经觉得我有更多的洞察力了。
    【解决方案3】:

    虽然这是一篇关于您可能没有使用的技术的特定博客,但它确实涵盖了如何诊断内存问题 - http://blogs.msdn.com/tess/archive/2008/09/12/asp-net-memory-issues-high-memory-usage-with-ajaxpro.aspx

    挖掘 Tess 的工作,她有很多调试/诊断帖子,我相信你能找到更多对你有用的。

    【讨论】:

      【解决方案4】:

      您是否在所有地方都正确地取消了事件处理程序的接线?有人告诉我,如果您从不将他们从活动中分离出来,他们可能会坐在那里。他们可能会将对较大对象的引用保留得比必要的时间更长。

      【讨论】:

        【解决方案5】:

        您是否正确处理了实现 IDisposable 的类的对象?这将包括 SqlConnections、SqlCommand、SqlDataAdapter、DirectoryEntry 等。您是否有任何使用未实现 IDisposable(和/或未释放)的非托管内存的对象?

        【讨论】:

        • 是的,我很确定我是 :-)
        【解决方案6】:

        我很确定你现在已经完成了所有的动作,但我在我维护的网站上遇到了类似的问题。

        该站点在服务器上使用了大约 1 gig 的内存,并且进行了很多检查和清理,我们不得不摆脱很多会话调用,因为它们没有被正确处理。

        事实证明,在我的网站上,我拥有的并发用户数量众多,对演出的粗略估计正是它所需要的。

        事实证明,在页面上加载大量用户控件会给服务器内存带来一些压力,不知道为什么,但它确实通过删除用户控件并将它们变成更小的页面来帮助我们查明一些问题。

        最后但并非最不重要的一点是检查您使用的是哪种类型的会话提供程序,如果 inproc 对您的服务器造成太大压力,也许是时候更改为 asp.net 状态会话服务或使用 sql 服务器作为您的会话提供程序.

        让我知道你的想法,如果你发现了细节。

        【讨论】:

          猜你喜欢
          • 2016-11-23
          • 2022-01-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-11
          • 1970-01-01
          • 1970-01-01
          • 2012-01-06
          相关资源
          最近更新 更多