4

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

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

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

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

是否可以设置一个内存“软限制”,应该强制进行 GC?目前,只有在内存达到绝对极限时才会执行 GC,从而导致 OOM。

4

3 回答 3

2

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

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

还有一些其他的可能性:

  1. 您的应用程序是否使用非托管内存?
  2. 您的应用程序是否在固定任何内存?如果是这样,那可能会导致碎片问题,尤其是在您不释放 pin 的情况下。
于 2013-07-26T12:47:12.173 回答
1

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

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

于 2013-04-10T10:30:45.590 回答
-1

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

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

于 2013-04-10T10:22:19.160 回答