垃圾收集运行得太晚 – 导致OutOfMemoryexception

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

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

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

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

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

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

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

还有其他一些可能性:

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

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

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

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

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