【问题标题】:.NET Memory leak analysis.NET 内存泄漏分析
【发布时间】:2012-06-26 10:14:00
【问题描述】:

我正试图在我们的一个应用程序中找到内存泄漏,但它非常难以捉摸。

我用 Ants 内存分析器分析了程序,发现泄漏发生在非托管代码中,而 Ants 内存分析器不适合:http://www.red-gate.com/supportcenter/content/ANTS_Memory_Profiler/help/7.4/amp_unmanaged_use 我检查了“图形缓冲区”和“问题与非托管代码中的对象处理”部分,但没有给出任何结果。

然后我使用了 Windows 调试诊断工具并进行了内存压力分析。大部分内存使用在本机堆中:堆 6 0x01ee0000(不是默认进程堆)。虚拟分配摘要内存低,泄漏分析中未完成的分配摘要内存低:没有一个模块具有高内存使用率。

我现在如何找到内存泄漏的位置?

【问题讨论】:

  • 您是否在使用非托管资源?来自非托管代码的文件、套接字、缓冲区等?您还可以给 Visual Studio 内存分析器一个机会,并将结果与​​其他结果进行比较。

标签: .net memory-leaks red-gate-ants dmp


【解决方案1】:

内存泄漏诊断是 Microsoft CRT 的内置功能,_CrtDumpMemoryLeaks() 函数提供报告。使用它需要在本机代码中编写单元测试,以便您可以启用调试分配器以使此功能工作。这反过来要求您必须为此非托管代码提供源代码,以便您可以使用 <crtdbg.h> 头文件启用调试分配器并构建单元测试。必备指南is here.

通常的症结在于您无权访问本机源代码。在这种情况下,您需要与此代码的供应商或作者合作以解决此问题。为他提供一个演示问题的小型重现项目,让他开始行动。

【讨论】:

    【解决方案2】:

    如果您想要真正的内存分析工具,请查看http://memprofiler.com/support.aspx。到目前为止,这是我用过的最好的内存泄漏工具之一。 .NET 与各处的非托管代码互操作。仅仅因为泄漏出现在非托管代码中并不意味着您的代码中没有保留引用问题。如果您提供一些您认为存在内存泄漏问题的详细信息以及有关您的解决方案的更多信息,也许我们可以提供更多解决方案。

    【讨论】:

      猜你喜欢
      • 2013-05-24
      • 1970-01-01
      • 2012-05-09
      • 2011-03-22
      • 1970-01-01
      • 2012-02-19
      • 1970-01-01
      • 2022-12-06
      相关资源
      最近更新 更多