【问题标题】:Memory leak in .Net.Net 中的内存泄漏
【发布时间】:2011-05-24 12:14:55
【问题描述】:

我想知道内存是否真的泄漏了。我的场景是这样的:

  1. 我的 .Net 应用程序占用了 x 量的内存。
  2. 我打开了一些对话框,现在它需要 x+y 的内存量
  3. 关闭所有最近打开的对话框
  4. 仍然记忆在 x + Y 左右

这是内存泄漏还是垃圾收集器没有清除内存的情况。

并且作为事件也被视为参考。如果事件出现在取消引用的对象中怎么办?那么该事件不会被视为参考,对吗?

【问题讨论】:

  • 您的问题含糊不清。你会提供更多信息吗?发布一些代码或给我们一个导致内存泄漏的真实场景。
  • 只想知道:由于即使在关闭打开的对话框后内存也没有被释放,这是否意味着它的内存泄漏或者可能是内存仍未被垃圾收集/
  • 分配内存很昂贵。 .NET 应用程序分配内存,但除非必要,否则不要将其返回给系统。别再看任务管理器了;它什么也没告诉你。当您获得 OOME 时,您就会知道存在泄漏/内存问题。
  • 除了 Wills 评论之外,您还应该尝试多次打开/关闭对话框,以查看消耗是否真的再次攀升。为了确定你需要像 redgate 的 ANTS 这样的内存分析器。

标签: c# memory-management memory-leaks


【解决方案1】:

垃圾收集器只释放不再被引用的对象。

它不会神奇地移除你不再想要的所有对象。

检查您是否仍有对任何对象的引用。请记住,事件也被视为引用。 (它需要知道去哪个对象)

【讨论】:

  • 有好几次我被抓住物体的事件所吸引。 +1
  • 完全正确。但据我所知,垃圾收集器不会立即收集取消引用的对象。它仅在应用程序内存不足时才收集对象。因此,在我的场景中,可能所有对象都被取消引用但仍未从内存中清除。对吗?
  • 比这要复杂一些。它需要考虑的事情更多。想想看,一个 10 Mb 的程序在开始释放之前不会等到填满 4gb。它不会只是等待内存耗尽。
  • 制作一个简单的测试按钮来创建对象,然后超出范围。点击几次。看看内存是否不断增加(它不应该)
  • Ok 发现内存泄漏是通过某些事件发生的,甚至某些对象也在泄漏。谢谢大家
【解决方案2】:

内存仅在需要时进行垃圾收集,当所谓的 0 代 已满或整个系统内存压力足以强制进行垃圾收集时,技术性更强。内存超出范围时不会自动回收。更多信息 herehere

只是为了测试,在关闭对话框后(不再引用它之后)尝试调用GC.Collect() 以强制GC 收集任何可用内存。

实际上,您应该摆弄垃圾收集器,它经过严格调整以获得最佳性能。

如果您怀疑自己确实在泄漏内存,请使用某种内存分析器来分析您的应用程序。

例如RedGates Memory Profiler,他们提供基于时间的试用。
关注此walk-through 以快速了解要查找的内容和方法。

【讨论】:

    【解决方案3】:

    在 .Net 中,一旦您不引用对象,该对象就会被收集回来。如果您有实时引用,则该对象将保持活动状态。因此,要找到内存泄漏,您需要执行以下操作

    1. 查找对象列表和被占用的内存
    2. 找出您怀疑现在应该释放的对象。
    3. 找到持有该对象的根。
    4. 修复根。

    您可以使用一些内存分析器来执行此操作,也可以使用 WinDbg+sos。人们觉得 windbg 很难使用,但对于这些情况,windbg+sos 更容易使用并且是免费的。修复泄漏后,您也会感到高兴。您将成为那些总是喜欢免费的强大工具的人之一。

    看看这个链接。

    http://blogs.msdn.com/b/ricom/archive/2004/12/10/279612.aspx

    http://blogs.msdn.com/b/delay/archive/2009/03/11/where-s-your-leak-at-using-windbg-sos-and-gcroot-to-diagnose-a-net-memory-leak.aspx

    【讨论】:

      【解决方案4】:

      使用诸如JetBrains dotTrace 之类的内存分析工具来分析您的应用程序的内存使用情况如何?

      【讨论】:

        【解决方案5】:

        可能是垃圾收集器没有清除内存

        【讨论】:

          猜你喜欢
          • 2011-03-22
          • 2012-05-29
          • 2012-02-19
          • 1970-01-01
          • 2022-12-06
          • 2010-09-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多