gpt4 book ai didi

c# - “隐式”垃圾收集不会减少内存占用。 GC.Collect() 确实

转载 作者:行者123 更新时间:2023-11-30 22:16:59 26 4
gpt4 key购买 nike

我有一个正在处理大量数据的应用程序,我正在监视它的 .NET 内存性能计数器。基于性能计数器,所有堆中的#Bytes 正在缓慢增长(每 12 小时约 20MB)。所有 3 代也被收集(gen0 每秒几次,gen1 大约每秒一次,gen2 大约每分钟一次)——但这并不能阻止所有堆中的#Bytes 缓慢增长。但是,如果我明确运行:

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

它将收集所有额外消耗的内存。 (例如,如果在 12 小时后运行,堆占用空间会减少 20MB)。我还尝试通过 sos 和 sosex 检查转储(在运行 GC.Collect 之前)- 大部分卡在周围的对象都没有根。

为什么隐式垃圾收集运行(由性能计数器显示)不收集内存,而显式 GC.Collect() 调用会收集内存?

编辑:

我忘了提到那些没 Root过的对象没有实现 IDisposable - 所以他们应该在第一次运行 GC 时在那个特定的世代被回收(换句话说 - 错误的 Dispose() 方法和潜在的问题deadlocked finalizer 在这里是没有问题的。但要指出 Stephen 和 Roy 指出这种可能性)

最佳答案

垃圾收集器实际上非常智能。如果没有必要,它不会收集内存,这为它提供了一些优化灵 active 。

它保持打开复活需要完成但尚未完成的对象的选项。只要不需要内存,垃圾收集器就不会强制终结,以防万一它可以复活那些对象。

关于c# - “隐式”垃圾收集不会减少内存占用。 GC.Collect() 确实,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17020623/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com