想知道是否有人可以对此有所了解。
我有一个具有大内存占用(和内存流失)的应用程序。没有任何内存泄漏,而且GC往往可以很好地释放资源。
然而,有时GC不会“按时”发生,导致内存不足异常。我想知道是否有人可以对此有所了解?
我使用了REDGate分析器,非常好 - 应用程序具有典型的“锯齿”模式 - OOM发生在锯齿的顶部。遗憾的是,无法使用分析器(AFAIK)来识别内存流失源。
是否可以设置内存'软限制',应该强制使用GC?目前,GC只在内存处于绝对限制时执行,从而产生OOM。
答案 0 :(得分:2)
垃圾收集不应该“及时发生”。当新的内存分配将Gen-0推到一定限度时,就会发生这种情况。因此,它们总是在内存分配将内存超过其限制之前发生。这种情况每天发生在世界各地很多次,如果有任何不为人知的错误,我会感到惊讶。
您是否认为实际上可能分配的内存多于可用内存?操作系统只允许您在大多数32位计算机上访问2GB。
还有其他一些可能性:
答案 1 :(得分:1)
如果你使用大量内存并且垃圾收集很多我猜你应该考虑“Flyweight”设计模式。
例如,如果您垃圾收集了很多字符串,请参阅String.Intern(string s)。 Msdn reference
答案 2 :(得分:-1)
您可以使用GC.collect()强制垃圾收集器完成其工作。但这不可取。
使用(memprofiler)等内存配置文件来检测泄漏。几乎所有代码都会在某些时候执行泄漏。