作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个正在处理大量数据的应用程序,我正在监视它的 .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/
我是一名优秀的程序员,十分优秀!