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

本文关键字:导致 OutOfMemory 异常 运行 | 更新日期: 2023-09-27 18:08:38

我想知道是否有人能解释一下这个问题。

我有一个应用程序有很大的内存占用(&内存生产)。没有任何内存泄漏,gc倾向于在释放资源方面做得很好。

然而,偶尔,GC没有"准时"发生,导致内存不足异常。我想知道有没有人能解释一下?

我使用了REDGate分析器,它非常好——应用程序有一个典型的"锯齿"模式——oom发生在锯齿的顶部。不幸的是,分析器不能用于(AFAIK)识别内存混乱的来源。

是否有可能设置内存"软限制",在该限制下应该强制执行GC ?目前,只有在内存达到绝对限制时才执行GC,这会导致oom。

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

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

您是否考虑过您实际上可能分配了比可用内存更多的内存?在大多数32位机器上,操作系统只允许您访问2GB。

还有一些其他的可能性:

  1. 您的应用程序是否使用非托管内存?
  2. 应用程序是否占用内存?如果是这样,可能会导致碎片问题,特别是如果你不释放pin。

如果你使用了大量的内存并且你进行了大量的垃圾收集,我想你应该考虑使用"Flyweight"设计模式。

作为一个例子,如果您对大量字符串进行垃圾回收,请参见String。实习生(字符串)。Msdn参考

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

使用内存配置文件,如(memprofiler)来检测泄漏。几乎所有的代码都会在某些地方执行泄漏。