C#内存泄漏,跟踪技术和工具

时间:2010-09-20 10:05:47

标签: c# .net memory-leaks

我写的应用程序因内存泄漏而遭受了相当大的痛苦。当用户关闭加载的项目时,几乎整个对象模型都停留在内存中。我知道这一点的方式是因为关闭我的应用程序中的项目几乎不影响任务管理器中的内存使用情况,然后打开一个新项目几乎使每次都加倍。我下载了jetBrain的dotTrace Memory 3.5,但很少(无)使用说明。我想知道如何使用它,它表明当我关闭项目后拍摄快照时,整个对象模型仍然在内存中。在我的项目中捕捉关闭代码我没有理由这样做。有没有人知道任何特别是通常会导致C#内存泄漏或任何用于追踪问题的工具或技术。一切都很好,有一个显示我的整个对象模型的应用程序仍然加载到内存中,但它没有显示我存储它的对象或变量。提前谢谢。

3 个答案:

答案 0 :(得分:4)

首先,调查是否可能由于事件处理程序的注册而导致泄漏,因为这是意外生根对象的最简单方法之一。例如,如果你有一个类'Bob',它将一个方法'OnSomeEvent'作为委托添加到由系统的长寿命组件引发的事件(例如'UserSettingsManager'),那么类'Bob的对象' '不会被收集,因为它们是一个事件处理程序保持活着(即事件回调不是弱引用)。

作为商业工具的替代方案,Windows调试器的扩展名为SoS(Son of Strike),可用于调试托管应用程序。然而,它不是胆小的,因为它是一个低级别的命令行工具,需要大量的前期学习。然而,它非常强大,并且不像商业工具那样在更大的进程(就堆消耗而言)方面那么费力。

就商业概况而言,我在使用Redgate的ANTS Memory Profiler方面有过很好的经历(但我有同事讨厌它)所以可能值得尝试一下。

答案 1 :(得分:3)

管理内存泄漏的最常见原因可能是未订阅的事件处理程序。

有很多有用的工具可以跟踪这样的错误。我个人喜欢ANTS Memory ProfilerWinDbg / SOS。您想要找出对象图的根源。使用WinDbg / SOS,有一个!gcroot命令,它将告诉你任何给定对象的根。

检查Tess' blog以获取有关如何使用WinDbg / SOS解决内存问题的指南。

答案 2 :(得分:1)