【问题标题】:.NET OutOfMemory exception.NET OutOfMemory 异常
【发布时间】:2009-10-01 18:46:12
【问题描述】:

我们有一个 .NET 应用程序在生产环境中运行了一年多。它是一个后台服务,它的编写方式是,如果它因任何原因崩溃,它将自动重新启动。直到最近,尽管它每天处理繁重的负载,但它并没有给我们带来任何头疼的问题,但现在每一次在蓝月亮中,它都会因 OutOfMemorey 异常而崩溃。重新启动后,它会在崩溃的地方拾起并执行它应该做的任何事情,所以客户不在乎,但我想了解导致崩溃的原因。

因此问题是:有没有办法在不重新部署应用程序的情况下检查崩溃? 我想做的是生成一个故障转储或一些东西,然后手动检查转储,试图找出哪些对象吃掉了我所有的内存。你会建议我使用什么工具来简化这项任务?

【问题讨论】:

    标签: .net memory-leaks


    【解决方案1】:

    您可能会发现 MSDN 中的以下文章很有帮助:

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

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

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

    您可能还想使用 Perfmon 连接到进程,看看您是否在第 1 代或第 2 代堆中获得大量增长 - 这通常表明对象在过多的垃圾收集和创建内存中幸存下来应用程序中的压力。您可能还想查看 Private Bytes 指标的大小 - 那里的增长表明正在为您的进程分配大量非托管内存。

    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

    【讨论】:

    • 还有另一个名为 EQATEC 的分析器。这也很好。 eqatec.com/tools/profiler
    • 我不能随意复制这个东西——正如我所提到的,它很少发生。作为替代方案,我想做事后分析。我只是不确定如何获得转储以及使用什么来分析它。
    猜你喜欢
    • 1970-01-01
    • 2013-12-09
    • 2023-04-03
    • 1970-01-01
    • 2015-07-28
    • 2018-06-18
    • 2015-04-25
    • 2016-04-26
    • 2014-07-15
    相关资源
    最近更新 更多