【问题标题】:How can I find out what is preventing garbage collection of an object?如何找出阻止对象垃圾收集的原因?
【发布时间】:2012-05-28 13:40:40
【问题描述】:

我的一些对象没有被垃圾回收,我需要找出对对象的引用在哪里以及是什么阻止了垃圾回收。

我正在使用 Visual Studio Express。

【问题讨论】:

  • 您是否首先尝试过 Microsoft CLR 分析器?这有一些内存分析工具可能会有所帮助:microsoft.com/en-us/download/details.aspx?id=16273
  • 你的代码是。注意,只有当它无法到达(没有其他东西在引用它)并且它是一个托管对象并且正在调用 collect 时,它才会被垃圾收集。
  • 我曾尝试使用 CLRProfiler,但它只是给我错误消息,而且似乎无法正常运行。
  • @TonyHopkinson:我调用 GC.collect 只是为了确保它运行。
  • @Gerve。除非您知道它无法访问,否则这样做没有意义。如果这是沼泽标准对象,即您不会搞乱非托管的东西。然后你需要找到所有指向你认为不可达的对象的东西,并在你调用 collect 之前确保它们也是不可达的。这通常是一些像 orderline 没有被收集的东西,因为它在一个订单行集合中。 IE。在你清除 order.orderlines 之前,它会挂起。

标签: c# wpf visual-studio-express


【解决方案1】:

您可以尝试使用Ants Memory Profiler,这是一个非常流行的工具。它相当容易使用,它试图给你一个图表来说明你的参考资料是什么。下面我相信它的功能与 Bond 建议的类似,但它提供了更简单的用户体验。

它提供 14 天免费试用。实例图的示例如下所示:

【讨论】:

  • 感谢 Ian,这是一个很棒的工具。
【解决方案2】:

你可以试试sos extensions 换成windbg 特别是 dumpheap 和 heapstat 命令

【讨论】:

  • 准确的答案,但对于胆小的人来说并非易事;p
【解决方案3】:

我建议:

  1. 分析代码并调试
  2. 如果你无法找到泄漏,你可以试试这个工具:Memprofiler

【讨论】:

    猜你喜欢
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    • 2015-04-22
    • 1970-01-01
    • 2010-11-08
    • 2012-10-04
    相关资源
    最近更新 更多