检测ASP.NET中的内存泄漏

Aar*_*ron 30 c# asp.net telerik iis-7.5

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

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

谢谢,

亚伦

Dam*_*ver 38

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

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

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

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

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

    .loadby sos mscorwks

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

!dumpheap -stat
Run Code Online (Sandbox Code Playgroud)

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

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

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


例如,去年五月的帖子,如果你使用XmlSerializer非默认构造函数的s ,详细说明一个潜在的问题.


Ode*_*ded 5

有很多内存分析器。

一种流行的是DotTrace,另一种是ANTS memory profiler,两者都是商业产品。