.NET内存泄漏分析

问题描述:

我试图在我们的某个应用程序中发现内存泄漏,但它很难实现。.NET内存泄漏分析

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

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

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

+0

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

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

通常的问题在于您无法访问本机源代码。在这种情况下,您需要与供应商或此代码的作者合作解决此问题。通过向他提供一个小型的repro项目来展示问题,从而实现滚动。

如果你想要一个真正的内存分析器工具,看看http://memprofiler.com/support.aspx。迄今为止,我曾经使用过的最好的内存泄漏工具之一。 .NET与所有地方的非托管代码进行互操作。只是因为泄漏出现在非托管代码中并不意味着您的代码中没有持有引用问题。如果您提供了一些关于您认为存在内存泄漏问题的原因以及更多关于解决方案的细节,那么我们可能会提供更多解决方案。