.NET OutOfMemory异常

时间:2009-10-01 18:46:12

标签: .net memory-leaks

我们有一个.NET应用程序在生产中运行超过一年。它是一个后台服务,它的编写方式是,如果它因任何原因崩溃,它将自动重启。直到最近它并没有给我们带来任何麻烦,尽管它每天处理的负荷很重,但现在每一次在蓝色的月亮它崩溃与OutOfMemorey例外。重新启动之后,它会在它崩溃的情况下接收并做任何应该做的事情,所以客户并不关心,但我想了解导致崩溃的原因。

因此问题:有没有办法检查崩溃而不重新部署应用程序? 我想要做的是生成崩溃转储或污染,然后手动通过转储,以试图找出什么对象吃了我的所有记忆。您建议我使用哪些工具来简化此任务?

1 个答案:

答案 0 :(得分:4)

您可能会从MSDN中找到以下文章:

  

.NET Framework应用程序的生产调试

     

http://msdn.microsoft.com/en-us/library/ms954591.aspx

虽然它详细讨论了ASP.NET应用程序,但在服务或独立应用程序上执行内存分析时,所描述的一些技术同样有效。

您可能还希望使用Perfmon连接到该进程,看看您是否在Gen 1或Gen 2堆中获得了大量增长 - 这通常表示存在太多垃圾收集并创建内存的对象你申请中的压力。您可能还想查看“专用字节数”度量标准的大小 - 增长表明已为您的进程分配了大量非托管内存。

Perfmon分析非常有用,因为它可以显示超时的内存使用情况,并帮助确定特定类型的处理或事务是否会导致内存消耗。

如果您可以在测试环境中重现问题,那么excellent memory profiler from the folks at Red Gate Software可以帮助查明此类问题,只需花费很长时间来挖掘内存转储。

有些工具可以在后台运行(例如DebugDiag),它们允许定期或在发生某些事件时进行内存转储。你可以在这里阅读它们:

http://blogs.msdn.com/sukeshak/pages/ddintro.aspx

http://blogs.msdn.com/tess/archive/2009/01/23/net-hang-analyzing-debug-diag-output.aspx