【问题标题】:Detecting Memory Leaks in ASP.NET [closed]在 ASP.NET 中检测内存泄漏
【发布时间】:2011-07-13 13:44:54
【问题描述】:

我的开发团队目前正在使用 ASP.NET 3.5 / 4.0,我们的网站在 IIS 7.5 上运行。最近,我们遇到了一些问题(大约每周一次),这些问题导致我们的 ASP.NET 应用程序中抛出内存不足异常。 “解决方案”是重启我们网站上的应用程序池。我说“解决方案”是因为它几乎不是解决方案;它更像是一种绷带,只是让我们的应用程序池以合理的状态运行。在我看来,某些应用程序或许多应用程序正在泄漏内存,这会随着时间的推移而增加并导致内存不足异常。虽然我可以将 IIS 设置为定期重新启动应用程序池,但我宁愿知道如何检测内存泄漏以尝试修复程序,而不是继续使用创可贴。是否有任何工具可以检测和记录 ASP.NET 应用程序的内存泄漏?

此外,当我们改用 Telerik 的 RAD 控件时,我们确实开始看到更多此类问题。其他人在使用这些控件时遇到过类似的问题吗?

谢谢,

亚伦

【问题讨论】:

  • 您是否正在从您的应用程序中调用任何非托管代码?如果是这样,我会开始寻找那里。
  • 这个问题不应该被关闭。它提出了一个简单的问题“是否有任何工具可以检测和记录 ASP.NET 应用程序的内存泄漏?”。这绝对是一个可以在 SO 格式中回答的有效问题。

标签: c# asp.net telerik iis-7.5


【解决方案1】:

我之前发布此指南是为了回答另一个问题,但该问题和我的回答似乎已被删除。这不适合胆小的人:

  1. 在服务器上安装适用于 Windows 的调试工具(作为 Windows SDK 的一部分提供)
  2. 当应用程序运行一段时间后,使用 adplus 捕获进程的内存转储(使用诸如 Process Explorer 之类的工具来查找要转储的正确进程 ID 很有用):

    ADPLUS -hang -p <process id> -o .

  3. 这将创建一个包含内存转储的目录。您现在可以使用 windbg,并打开转储文件(文件 -> 打开故障转储...)

  4. 非托管代码的乐趣现在出现了。但是您使用一种叫做 Son of Strike 的东西,它可以理解 .NET 代码,来查看分配了哪些对象。首先加载 SOS:

    .loadby sos mscorwks

然后你要求它检查托管堆:

!dumpheap -stat

这通常会产生大量输出,但有两列按类型显示实例数和消耗的内存量。您希望看到很多的某些类型(例如 String),但是如果您自己的一种类型有数千个实例,您可能会以某种方式泄漏这些对象。过去吸引我的一个是将对象中的事件处理程序连接到应用程序中的静态事件 - 然后该事件对这些对象中的每一个都有实时引用。

我不记得大部分是如何工作的,一般参考这个cheat sheet for SOS

Tess Ferrandez 有一个 good blog,它有时涵盖使用非托管调试器进行 .NET 调试


例如a post from last May,详细说明了将 XmlSerializers 与非默认构造函数一起使用时的潜在问题。

【讨论】:

  • 谢谢!我最终使用了这种方法。它确实为我指明了正确的方向。
  • 非常感谢,这对我帮助很大。另外,对于我的鞋子的任何人,我必须使用其他两个答案¹ ² 才能获得记忆。
【解决方案2】:

那里有很多内存分析器。

一个受欢迎的是DotTrace,另一个是ANTS memory profiler,两者都是商业产品。

【讨论】:

  • DotTrace 是为了提高性能,但同一页面有指向 dotmemory 的链接,这对于检测内存泄漏非常有帮助。
  • ANTS 分析器易于使用,Red-Gate 网站上有一个很棒的演练,不仅清楚地解释了如何使用它,而且还包含许多有用的信息。几年前,我和另一位开发人员在一个大型 Web 表单项目中成功使用了它。
【解决方案3】:

您可以降低到非常低的水平,而无需支付第三方工具的费用。不过,这不适合胆小的人。

Get Started: Debugging Memory Related Issues in .Net Application Using WinDBG and SOS

Memory Leak Detection Using Windbg

【讨论】:

    【解决方案4】:

    ASP 的 .Net 内存泄漏将仅限于任何持续存在的情况。应用程序状态以及在较小程度上的会话状态。

    在这些区域内工作的任何东西都是第一个检查的。

    此外,任何类中的静态对象,尤其是列表或任何类型的对象。

    【讨论】:

      【解决方案5】:

      您也可以尝试使用 asp.net web profiler。它是一个免费工具,允许您在应用程序运行时查看存储在内存中的信息。

      这允许您分析asp.net缓存,查看所有当前会话和应用程序状态的内容。

      【讨论】:

        猜你喜欢
        • 2012-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-22
        • 2015-02-28
        相关资源
        最近更新 更多