检测ASP.NET中的内存泄漏

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

此外,当我们切换到使用Telerik的RAD控件时,我们真的开始看到更多这个问题。 有没有其他人使用这些控件有类似的问题?

谢谢,

亚伦

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

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

    ADPLUS -hang -p -o .

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

  4. 现在出现了非托管代码的乐趣。 但是你使用一种叫做攻击之子的东西来理解.NET代码,看看分配了什么对象。 首先加载SOS:

    .loadby sos mscorwks

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

 !dumpheap -stat 

这通常会产生大量输出,但有两列显示实例数和按类型消耗的内存量。 你希望看到很多类型的某些类型(例如字符串),但是,如果你自己的类型有数千个实例,那么你可能会以某种方式泄露这些对象。 过去引起我注意的是将对象中的事件处理程序连接到应用程序中的静态事件 – 该事件随后会对这些对象中的每个对象进行实时引用。

我永远不会记得大部分工作原理,并且通常会参考这个SOS的备忘单

Tess Ferrandez有一个很好的博客 ,有时候会使用非托管调试器进行.NET调试


例如, 来自去年五月的post ,详细说明了如果将XmlSerializer与非默认构造函数一起使用时可能出现的问题。

那里有很多内存分析器。

一个流行的是DotTrace ,另一个是ANTS内存分析器 ,两者都是商业产品。

您可以在不支付第三方工具的情况下降低到非常低的水平。 这不适合胆小的人。

入门:使用WinDBG和SOS调试.Net应用程序中的内存相关问题

使用Windbg进行内存泄漏检测

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

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

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

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

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