这是一个应该是连续运行的无人值守控制台应用程序的问题:我看到过于频繁的应用程序退出System.OutOfMemoryException
是从调用堆栈深处的各种方法中抛出的——经常System.String.ToCharArray()
,或System.String.CtorCharArrayStartLength()
,或System.Xml.XmlTextReaderImpl.InitTextReaderInput()
,但有时向下在调用堆栈中的System.String.Concat()
调用中MongoCollection.Save()
,以及其他不太可能的地方。
值得一提的是,我们正在使用并行任务,但这基本上是服务器上运行的唯一应用程序,并且应用程序的总线程数永远不会超过 60。在其中一些情况下,我知道其他一些异常的原因被抛出,但 OutOfMemoryException 在这些上下文中没有意义,并且会产生问题:
- 根据 TaskManager 和 Perfmon 日志,发生这种情况时,系统至少有 8GB 可用内存中的 65%,并且
- 虽然异常处理程序有时会触发并记录异常,但它们并不能防止应用程序崩溃,并且
- 如果没有用户交互,则不会继续此异常(除非您禁止 Windows 错误报告,这不是我们想要的系统范围内的,或者将应用程序作为服务运行,这对于我们的用例来说是可能的但次优)
所以我知道上面提到的解决方法,但我真正想要的是一些解释——最好是基于代码的处理程序——用于意外的 OOM 异常,以便我们可以使用适当的延续逻辑。有任何想法吗?