问题描述
我们有一个保存所有服务器逻辑的Asp.NET应用程序。
此应用程序仅容纳服务(无页面)。
一段时间后,由于某种原因,w3wp.exe进程的内存消耗趋于膨胀。
它可以在几秒钟内增长到可用的最大大小(在我的服务器中为10 GB)。
它出乎意料地发生,因此我们无法真正按需重新创建。
我需要一些调试此问题的帮助。
有谁知道我可以使用的好工具?也许我可以告诉我在进程达到某些内存消耗时转储内存或拍摄快照。
任何帮助将不胜感激。
丹尼尔
解决方法
Red Gate提供了一些非常不错的.NET分析工具。我相信内存分析器(应该可以帮助您发现泄漏)具有一个可能有用的评估版本。
一些简单的检查事项:
您是否正在分配任何IDisposable对象(HttpWebRequest,WCF对象,使用非托管资源或不安全代码的任何对象)并且不处理它们?
您是否有任何查询可能试图将整个非常大的表加载到RAM中? (不太可能)检查处理SQL结果的任何LINQ代码周围的内存使用情况。
, 关于调试,这里有很多很好的答案。
解决该问题的另一种方法是使用代码审查。
内存可以通过多种方式在程序中泄漏。但是几乎可以肯定的是,由于几秒钟的代码循环,它在几秒钟内泄漏了几个GB。
所以:
识别代码中的所有循环
首先看一下是否可以看到问题
如果没有,则发出将记录每次迭代的日志记录调用
部署并等待下一次发生
检查日志以查看失控循环的位置
, 如果可以在开发环境中实现,那么您应该能够使用Visual Studio的内置分析工具来跟踪问题。
如果仅在生产环境中发生这种情况,请查看以下内容:https://rpm.newrelic.com
, Tess Ferrandez的博客是调试ASP.NET的好资源:
http://blogs.msdn.com/b/tess/archive/tags/memory+issues/
http://blogs.msdn.com/b/tess/archive/2008/04/03/net-debugging-demos-lab-7-memory-leak-review.aspx
有多种捕获内存转储的方法,您可以使用WinDbg和SOS脱机检查它们:
http://www.wintellect.com/CS/blogs/jrobbins/archive/2010/06/17/how-to-capture-a-minidump-let-me-count-the-ways.aspx