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

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

谢谢

亚伦

推荐答案

我之前发布本指南是为了回答另一个问题,但该问题和我的答案似乎已被删除.这不是为胆小的人准备的:

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

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

  3. This will create a directory containing the memory dump. You can now use windbg, and open the dump file (File -> Open Crash Dump...)

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

    .loadby sos mscorwks

然后请求它判断托管堆:

!dumpheap -stat

这通常会产生大量输出,但是有两列按类型显示实例数量和消耗的内存量.有些类型您预计会看到很多(例如字符串),但是如果您自己的类型有数千个实例,那么您可能会以某种方式泄漏这些对象.我在过go 遇到的一个问题是将对象中的事件处理程序连接到应用程序中的静电事件-然后该事件就会有一个对每个对象的实时引用.

我从来不记得大部分是怎么工作的,通常指的是这cheat sheet for SOS

苔丝·费兰德斯有一张good blog英镑的支票,有时还可以报销.NET使用非托管调试器进行调试


例如,a post from last May,详细说明了如果将XmlSerializer与非默认构造函数一起使用可能会出现的问题.

Asp.net相关问答推荐

缓存httpmessage内容

ASP.NET Core 延迟加载始终返回 null

有人可以解释一下这个Eager 加载示例吗?

DBSet 不包含 Where 的定义

Web 服务器配置为不列出此目录的内容. asp.net vs 2012 错误?

Dotnet core 2.0 身份验证多模式身份 cookie 和 jwt

业务逻辑中的实体框架最佳实践?

返回 HttpResponseMessage 时的 WebAPI Gzip

IIS 6/ASP.NET Windows 身份验证 list ?

RestSharp 不反序列化 JSON 对象列表,始终为 Null

我需要更改什么以允许我的 IIS7 ASP.Net 3.5 应用程序创建事件源并将事件记录到 Windows EventLog?

没有回发的按钮?

部署后网站需要强制刷新

AddDefaultTokenProviders:它是什么以及如何使用那些默认提供者?

如何将枚举类型绑定到 DropDownList?

如何从 NuGet 安装 EntityFramework 5.0(和其他旧版本)?

如何使用restsharp下载文件

如何使用 encodeURIComponent() 解码在 JS 中编码的 HTML?

盒式磁带包与 MVC4 包

Windows 身份验证在本地 IIS 7.5 上不起作用.错误 401.1