【问题标题】:C# Memory leak, tracking techinques and toolsC#内存泄漏、跟踪技术和工具
【发布时间】:2010-09-20 10:05:47
【问题描述】:

我正在编写的应用程序因内存泄漏而受到严重影响。当用户关闭加载的项目时,几乎整个对象模型都保留在内存中。我知道这是因为在我的应用程序中关闭一个项目几乎不会影响任务管理器中的内存使用,然后打开一个新项目几乎每次都会使它翻倍。我下载了 jetBrain 的 dotTrace Memory 3.5,但几乎没有(没有)使用说明。我有点弄清楚如何使用它,它表明当我在项目关闭后拍摄快照时,整个对象模型仍在内存中。浏览我的 projectClose 代码,我看不出有什么原因。有谁知道通常会导致 C# 中的内存泄漏的任何东西,或者任何用于追踪问题的工具或技术。有一个显示我的整个对象模型的应用程序仍然加载到内存中,但它没有显示存储它的对象或变量是什么,这一切都很好。提前致谢。

【问题讨论】:

  • 你应该使用 deleaker - 它会帮助你解决内存泄漏

标签: c# .net memory-leaks


【解决方案1】:

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

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

在商业分析器方面,我对 Redgate 的 ANTS Memory Profiler 有过很好的体验(但我有同事讨厌它),所以它可能值得一试。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:
      猜你喜欢
      • 1970-01-01
      • 2011-04-21
      • 2012-08-11
      • 1970-01-01
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多