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

C# 垃圾收集运行太晚-导致OutOfMemory异常,c#,garbage-collection,out-of-memory,C#,Garbage Collection,Out Of Memory,我想知道是否有人能解释这件事 我有一个应用程序,它有一个很大的内存占用空间(内存搅动)。没有任何内存泄漏,地面军事系统往往能很好地释放资源 但是,偶尔GC不会“按时”发生,从而导致内存不足异常。我想知道是否有人能解释这件事 我使用了REDGate profiler,它非常好——应用程序有一个典型的“锯齿”模式——OOM发生在锯齿的顶部。不幸的是,不能使用探查器(AFAIK)来识别内存流失的来源 是否可以设置一个内存“软限制”,在该限制下应该强制GC?目前,仅当内存处于绝对限制时才执行GC,从而导

我想知道是否有人能解释这件事

我有一个应用程序,它有一个很大的内存占用空间(内存搅动)。没有任何内存泄漏,地面军事系统往往能很好地释放资源

但是,偶尔GC不会“按时”发生,从而导致内存不足异常。我想知道是否有人能解释这件事

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

是否可以设置一个内存“软限制”,在该限制下应该强制GC?目前,仅当内存处于绝对限制时才执行GC,从而导致OOM。

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


使用类似()的内存配置文件来检测泄漏。几乎所有的代码都在某些点执行漏洞。

如果你使用大量内存和垃圾收集很多东西,我想你应该考虑“设计模式”。 例如,如果垃圾收集大量字符串,请参阅String.Intern(String s)。
垃圾收集不可能“不及时发生”。当新的内存分配将Gen-0推过某个限制时,就会发生这种情况。因此,它们总是在内存分配将内存推过其限制之前发生。这种情况在全世界每天都会发生很多次,如果有任何bug不为人所知,我会感到惊讶

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

还有其他一些可能性:

  • 您的应用程序是否使用非托管内存
  • 你的应用程序有内存吗?如果是这样的话,这可能会导致碎片问题,尤其是在您没有释放pin的情况下

  • 您是否曾经验证过没有泄漏?是否不可能在usings中封装大部件或调用GC。偶尔收集?奇怪的是,为什么内存中一次需要这么多数据..我会运行内存探查器,因为在出现内存不足异常时,您经常会做一些不想做的事情。手动调用垃圾回收器对这种情况没有帮助-如果有,那么首先就不会出现OOM异常。“Tere没有任何内存泄漏”这不是有点乐观吗?请使用正确的拼写。这不是聊天。什么是“轻量级”设计模式?我现在也很好奇。你有这个设计模式的来源吗@Thomas?最初@Thomas写了
    轻量级设计模式
    ,也许他指的是Flyweight模式或类似的smth,但在做一些语法修复时,我把
    轻量级
    单词包装成了大括号,这让我们感到困惑。对不起。谢谢阿列克西,我在用法语思考(概念赞助人Poids mouche-),对不起我的坏习惯。我是说Flyweight。我把措辞改为Flyewight for you Thomas。问题似乎是,限制是否可以设定。您能否添加有关如何确定Gen-0限制的信息。例如,它是否考虑了整个可用系统内存。