& # 39;隐# 39;垃圾收集不会减少内存占用.GC.Collect()
本文关键字:内存 GC Collect | 更新日期: 2023-09-27 18:17:35
我有一个处理大量数据的应用程序,我正在监视它的。net内存性能计数器。基于性能计数器,所有堆中的#Bytes正在缓慢增长(大约每12小时20MB)。所有3代也都被收集(第0代每秒几次,第1代大约每秒一次,第2代大约每分钟一次)——但这并不能阻止所有堆中的#Bytes缓慢增长。但是,如果我显式地运行:
GC.Collect();
GC.WaitForPendingFinalizers();
它将收集所有额外消耗的内存。(例如,如果在12小时后运行,堆占用减少20MB)。我还试图通过sos和sosex检查转储(在运行GC.Collect
之前)-并且大多数挂在周围的对象都是未根的。
为什么隐式垃圾收集运行(由性能计数器显示)不收集内存,显式GC.Collect()
调用?
我忘了提到那些未根的对象并没有实现IDisposable——所以它们应该在那个特定代的GC第一次运行时被回收(换句话说——错误Dispose()方法和死锁终结器的潜在问题在这里是没有问题的。但是Stephen和Roy指出了这种可能性)
垃圾收集器实际上是非常智能的。如果没有必要,它不会收集内存,这为它提供了一些优化灵活性。
使选项保持打开状态,以恢复需要完成但尚未完成的对象。只要不需要内存,垃圾收集器就不会强制结束,以防它可以重新启动那些对象。