我有一些 C# 代码。我使用代码分析来查找我不使用using(){}
或不调用 dispose 的所有地方。就这样完成了。然而它仍然泄漏。除了两个函数(SetWindowPos、SetForegroundWindow)之外,代码不调用 DllImport,但这些函数从未被调用(主实例不使用它。其他实例使用它,但它们会存活几秒钟)。
不知何故,这段代码正在泄漏。我如何找出问题所在?
我有一些 C# 代码。我使用代码分析来查找我不使用using(){}
或不调用 dispose 的所有地方。就这样完成了。然而它仍然泄漏。除了两个函数(SetWindowPos、SetForegroundWindow)之外,代码不调用 DllImport,但这些函数从未被调用(主实例不使用它。其他实例使用它,但它们会存活几秒钟)。
不知何故,这段代码正在泄漏。我如何找出问题所在?
托管代码中的内存泄漏通常是由于意外引用将对象保存在内存中。事件处理程序是这里的常见罪魁祸首。
你会想要一个内存分析工具。SciTech 的 .NET Memory Profiler可能是最好的,尽管JetBrains 的 dotTrace和RedGate 的 ANTS也都不错。
Microsoft 有一个免费的分析工具CLR Profiler可以使用,尽管它有点复杂。请参阅此处和此处以获取一些指导。
.NET的DRONE profiler似乎有一个免费的个人许可证,尽管我自己并不熟悉这个工具。他们在这里有一篇关于使用他们的分析器查找内存泄漏的文章。
Visual Studio 的高端版本还包含分析工具。MSDN 包含有关如何使用它们的文档。
使用 Visual Studio(Premium 和 Ultimate)内置的分析器分析您的应用程序,或投资于ANTS之类的工具。