识别ASP.NET应用程序中的内存问题

时间:2008-11-30 22:12:45

标签: asp.net iis memory profiling

我已经运行了一个ASP.NET应用程序,并且在生产盒上它使用了大约450MB的RAM,然而,它不应该使用相当多,并且它似乎随着时间的推移而增加,所以似乎可能存在泄漏或至少没有正确释放的东西。

我看了PerfMon,GC Gen2中有416MB。

任何人都有任何想法,想知道它在记忆中的含义是什么?我可以抓住dotTrace / ANTS并以某种方式将它附加到我的IIS(6 - 在Windows Server 2003上) - 或者有更好的方法吗? : - )

感谢。

6 个答案:

答案 0 :(得分:3)

在循环中新建一串字符串的经典问题可能会导致您看到的问题,因为在不释放新字符串的情况下会为新字符串分配大量内存。你在适当的地方使用StringBuilder吗?

答案 1 :(得分:2)

观看this Tess的TecheEd演讲将是一个良好的开端。

她演示了如何使用adplus来转储消耗大量RAM的ASP.NET应用程序,然后将该转储加载到WinDbg中进行分析。在WinDbg中使用!gcroot命令查找意外的根并从那里开始。她建议不要存储包含对缓存或会话中其他对象的引用的复杂类型。

答案 2 :(得分:1)

虽然这是一篇关于您可能没有使用的技术的特定博客,但它确实涵盖了如何诊断内存问题 - http://blogs.msdn.com/tess/archive/2008/09/12/asp-net-memory-issues-high-memory-usage-with-ajaxpro.aspx

通过Tess的工作,她有很多调试/诊断帖子,我相信你可以找到更多对你有用的东西。

答案 3 :(得分:1)

您到处都是正确无线的事件处理程序吗?我被告知如果你从未将他们与活动分开,他们可能会坐在那里。他们可能会长时间地引用更大的对象。

答案 4 :(得分:0)

您是否正确处理了实现IDisposable的类的对象?这将包括SqlConnections,SqlCommand,SqlDataAdapter,DirectoryEntry等。您是否有任何使用非托管内存但没有实现IDisposable(和/或没有被处置)的对象?

答案 5 :(得分:0)

我很确定你现在已经完成了所有动作,但我在我维护的网站上遇到了类似的问题。

该网站在服务器上大致使用了大量的内存,并进行了大量的检查和清理,我们不得不摆脱大量的会话呼叫,因为它们没有被正确处理。

事实证明,在我网站的网站上,我拥有的并发用户数量,粗略估计一个演出就是它所需要的。

事实证明,在页面上加载大量用户控件会给服务器内存带来一点压力,不确定原因,但它确实帮助我们通过删除用户控件并将它们变成更小的页面来查明一些问题。 / p>

最后但并非最不重要的是检查您正在使用的会话提供程序类型,如果inproc对您的服务器造成太大压力,可能是时候更改为asp.net状态会话服务或使用sql server作为会话提供程序

让我知道您的想法以及您是否找到了具体内容。