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

时间:2011-09-23 16:07:51

标签: .net nhibernate garbage-collection executionengineexception

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

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

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

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

1 个答案:

答案 0 :(得分:5)

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

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