12

MSDN,有一个“提示”指出,在重负载下运行并发垃圾收集.NET应用程序(无论是<gcConcurrent enabled="true"/>或指定,因为它是默认的行为)可能会抛出一个ExecutionEngineException。有没有人知道一个Microsoft知识库文章或其他来源提供了额外的背景?为什么并发GC有时会导致ExecutionEngineException(每个MSDN)?

我们已经与基于3.2 NHibernate的Windows服务应用程序,这将至多几个小时的手术后,总是崩溃直接经历过这个。我们能够追踪到ISession.Flush()调用的异常。

有上nhusers报告似乎是同样的问题thread。尽管切换到隐式禁用并发GC的服务器模式GC(<gcServer enable="true"/>),他建议的解决方法是禁用并发GC,但它仍然有效。

提交这MS作为一个bug之前,我想看看是否有任何人有尖端提到了并行GC instablity的附加信息。

+2

鉴于它被记录在案,您的错误可能会被视为“按设计”关闭。除此之外,有趣的问题。 – vcsjones

+2

@Nick Jones:.NET 4.0文档也将其列为过时,并声明运行时不再抛出此异常。 – casperOne

+0

@casperOne:注意到,但是NH 3.2是针对.NET 3.5编译的。 –

回答

5

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

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

+1

注意的是,虽然“API”标记陈旧,错误确实发生在** .NET 4.0 **(例如,这个线程:[应用程序在.NET运行时出现“内部错误”](http://stackoverflow.com/q/4367664/69809))。 [MSDN KB条目](http://support.microsoft.com/kb/2679415)将其描述为x64 .NET 4问题,但我不打赌它仅限于x64。我们遇到了同样的问题,并且也涉及到NHibernate,并且关闭了并发GC来修复它。它很糟糕,早上来工作,看到我们的主服务器应用程序由于内部的.NET异常而停下来。 :) – Groo