根据 MSDN ,有一个“提示”指出在并发垃圾收集(<gcConcurrent enabled="true"/> 或未指定,因为它是默认行为)的重负载下运行的 .NET 应用程序可能会抛出 ExecutionEngineException。是否有人知道 Microsoft KB 文章或其他提供有关此背景的资料?

我们在基于 NHibernate 3.2 的 Windows 服务应用程序中直接遇到过这种情况,该应用程序最多在运行几个小时后就会崩溃。我们能够追踪到 ISession.Flush() 调用的异常。

在 nhusers 上有一个 thread 报告似乎是同样的问题。他建议的解决方法,即禁用并发 GC,到目前为止对我们有用,尽管切换到隐式禁用并发 GC 的服务器模式 GC ( <gcServer enable="true"/> ) 也起到了作用。

在将此作为错误提交给 MS 之前,我想知道是否有人有关于该提示提到的并发 GC 不稳定的其他信息。

最佳答案

我怀疑当应用程序负载过重时会发生这种情况,因为当启用并发 GC 时,GC 会尝试在不暂停应用程序的情况下完成它的工作。如果 GC 在 GC 周期的压缩阶段遇到尝试移动内存但无法移动内存或无法正确更新应用程序指针的情况,则可能导致运行时抛出此问题异常,因为它最终会将您的应用程序置于潜在的无效状态。

正如@casperOne 在他的评论中指出的那样,这个异常在 .NET 4.0 中被标记为过时,尽管这并不一定意味着 GC 仍然无法进入导致它在 .NET 3.5 中抛出异常的相同状态。如果 GC 确实进入了相同的状态,则运行时将发出 FailFast 命令并终止而不是抛出异常。

关于.net - 为什么并发 GC 有时会导致 ExecutionEngineException(根据 MSDN)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7531860/

10-14 00:18