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