为什么并发GC有时会导致ExecutionEngineException(每个MSDN)?

Nic*_*nes 12 .net nhibernate garbage-collection executionengineexception

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

我们直接使用基于NHibernate 3.2的Windows服务应用程序,经过最多几个小时的运行后,它总是会崩溃.我们能够跟踪ISession.Flush()调用的异常.

nhusers上有一个线程报告似乎是同一个问题.他建议的解决方法,即禁用并发GC,到目前为止对我们有用,虽然切换到服务器模式GC(<gcServer enable="true"/>),隐式禁用并发GC,也做了伎俩.

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

Sco*_*man 5

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

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