2010-09-20 93 views
8

我正在写的应用程序从内存泄漏中受到相当戏剧性的损害。当用户关闭一个已加载的项目时,几乎整个对象模型都停留在内存中。我知道这是因为在我的应用程序中关闭项目几乎不会影响任务管理器中的内存使用,然后打开一个新项目几乎每次都会使其翻倍。我下载了jetBrain的dotTrace Memory 3.5,但几乎没有(无)使用说明。我有点想象如何使用它,它表明当项目关闭后我拍摄快照时,整个对象模型仍然在内存中。通过我的项目拖网关闭代码我看不出有任何理由。有没有人知道任何特别的事情,通常会导致C#中的内存泄漏或任何工具或技术来追踪问题。它的一切都很好,并有一个应用程序,显示我的整个对象模型仍然被加载到内存中,但它并没有告诉我什么对象或变量存储它。提前致谢。C#内存泄漏,跟踪技术和工具

+0

你应该使用deleaker - 它会帮助你解决内存泄漏 – 2011-12-20 18:31:48

回答

4

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

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

就商业性能测试人员而言,我在Redgate的ANTS Memory Profiler方面有很好的经验(但我曾有同事讨厌它),所以这可能值得试用。

3

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

有很多有用的工具来跟踪这样的错误。我个人喜欢ANTS Memory ProfilerWinDbg/SOS。你想找出什么是生根对象图。使用WinDbg/SOS有一个!gcroot命令,它会告诉你任何给定对象的根。

有关如何使用WinDbg/SOS解决内存问题的指导,请参阅Tess' blog