c# - 检测 ASP.NET 中的内存泄漏

标签 c# asp.net telerik iis-7.5

<分区>

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

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

谢谢,

亚伦

最佳答案

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

  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 ,如果你使用 XmlSerializer 会详细说明一个潜在的问题带有非默认构造函数的 s。

关于c# - 检测 ASP.NET 中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5274566/

相关文章:

asp.net - telerik asp.net 控制清除客户端

c# - 在 View JQuery 中获取 ViewData

c# - 如何将多个表作为一个 XML 返回?

c# - Fluent NHibernate - 配置持久层时发生异常

jquery - 从 ASP.NET 中的母版页或默认页链接到 jquery 脚本文件

asp.net - 为什么底层成员(member)资格提供商应该决定是否……?

javascript - Kendo UI Scheduler 未正确绑定(bind)资源

c# - 如何检测var是否为字符串

c# - 用一定数量的元素初始化 List<>

c# - 重新生成 Entity Framework 代码优先模型