【问题标题】:Will GC.Collect() + GC.WaitForPendingFinalizers() ever NOT reclaim all reclaimable memory?GC.Collect() + GC.WaitForPendingFinalizers() 会不会回收所有可回收的内存?
【发布时间】:2012-09-21 17:02:18
【问题描述】:

我正在尝试通过在析构函数中使用 console.WriteLine() 来确保释放某个类的实例,但输出永远不会出现。

我仔细搜索了任何挥之不去的参考资料以及事件订阅,但没有找到。只是为了我自己的理智,在我继续搜索之前,有人可以确认一下:

GC.Collect();
GC.WaitForPendingFinalizers();

无论对象多小,都会强制进行完全回收吗?

【问题讨论】:

  • 你需要做CollectWaitFor...Collect,否则将无法收集到可终结的对象。

标签: .net garbage-collection


【解决方案1】:

一般来说,这应该可以清理大部分内容。

但是,如果你的终结器中有代码,它是possible that you will need to call GC.Collect() twice,因为第一次会导致终结器执行,但实际内存直到终结器完成后才能被清理,这意味着后续调用将捕获对象。

【讨论】:

  • 哦,好吧。然后我的搜索继续。我会为 GC.GetListOfReferences(object) 命令 KILL... 似乎它会非常有用!
  • @HarryMexican 您可以使用 SoS 来获取调试器中的引用列表,以及许多 .NET 内存分析器。见:stackoverflow.com/q/707421/65358
  • 谢谢里德。如果没有 Memory Profiler,我就不会明白这一点。注意到 ConcurrentQueues 尽管为空,但仍持有引用。然后发现:blogs.msdn.com/b/pfxteam/archive/2012/05/08/… 果然,在系统运行了足够的流量后,ConcurrentQueue 开始释放,GC 开始完成。耶!
  • 看看blogs.msdn.com/b/dotnet/archive/2013/05/01/…,它为您提供类似于 SOS 的功能,只是无需任何额外的流程、设置等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多