垃圾收集运行得太晚 - 导致OutOfMemory异常

时间:2013-04-10 10:17:35

标签: c# garbage-collection out-of-memory

想知道是否有人可以对此有所了解。

我有一个具有大内存占用(和内存流失)的应用程序。没有任何内存泄漏,而且GC往往可以很好地释放资源。

然而,有时GC不会“按时”发生,导致内存不足异常。我想知道是否有人可以对此有所了解?

我使用了REDGate分析器,非常好 - 应用程序具有典型的“锯齿”模式 - OOM发生在锯齿的顶部。遗憾的是,无法使用分析器(AFAIK)来识别内存流失源。

是否可以设置内存'软限制',应该强制使用GC?目前,GC只在内存处于绝对限制时执行,从而产生OOM。

3 个答案:

答案 0 :(得分:2)

垃圾收集不应该“及时发生”。当新的内存分配将Gen-0推到一定限度时,就会发生这种情况。因此,它们总是在内存分配将内存超过其限制之前发生。这种情况每天发生在世界各地很多次,如果有任何不为人知的错误,我会感到惊讶。

您是否认为实际上可能分配的内存多于可用内存?操作系统只允许您在大多数32位计算机上访问2GB。

还有其他一些可能性:

  1. 您的应用程序是否使用未管理的内存?
  2. 您的应用是否固定任何内存?如果这样可能导致碎片问题,特别是如果你没有释放pin。

答案 1 :(得分:1)

如果你使用大量内存并且垃圾收集很多我猜你应该考虑“Flyweight”设计模式。

例如,如果您垃圾收集了很多字符串,请参阅String.Intern(string s)。 Msdn reference

答案 2 :(得分:-1)

您可以使用GC.collect()强制垃圾收集器完成其工作。但这不可取。

使用(memprofiler)等内存配置文件来检测泄漏。几乎所有代码都会在某些时候执行泄漏。