12

根据MSDN的说法,有一个“提示”指出,在高负载下运行并发垃圾收集(<gcConcurrent enabled="true"/>或未指定,因为它是默认行为)的 .NET 应用程序可能会引发 ExecutionEngineException。是否有人知道 Microsoft 知识库文章或其他提供更多背景信息的来源?

我们在一个基于 NHibernate 3.2 的 Windows 服务应用程序中直接体验到了这一点,该应用程序在最多运行几个小时后总是会崩溃。我们能够追踪到 ISession.Flush() 调用的异常。

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

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

4

1 回答 1

5

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

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

于 2011-09-24T01:20:28.653 回答