簡體   English   中英

為什么並發GC有時會導致ExecutionEngineException(每個MSDN)?

[英]Why does concurrent GC sometimes cause ExecutionEngineException (per MSDN)?

根據MSDN的說法,有一個“提示”指出,在帶有並發垃圾收集的重負載下運行的.NET應用程序( <gcConcurrent enabled="true"/>或未指定,因為它是默認行為)可能會拋出ExecutionEngineException。 是否有人知道Microsoft知識庫文章或其他來源提供了額外的背景知識?

我們直接使用基於NHibernate 3.2的Windows服務應用程序來體驗這一點,該應用程序在最多幾個小時的運行后總會崩潰。 我們能夠跟蹤ISession.Flush()調用的異常。

nhusers上有一個線程報告似乎是同一個問題。 他建議的解決方法,即禁用並發GC,到目前為止對我們<gcServer enable="true"/> ,雖然切換到服務器模式GC( <gcServer enable="true"/> ),隱式禁用並發GC,也做了伎倆。

在將此作為錯誤提交給MS之前,我想知道是否有人提供有關並發GC不穩定性的其他信息。

我懷疑當應用程序負載很重時會發生這種情況,因為當啟用並發GC時,GC會嘗試在不暫停應用程序的情況下執行此操作。 如果GC在GC循環的壓縮階段遇到嘗試移動內存但無法移動內存或無法正確更新應用程序指針的情況,則可能導致運行時拋出此內容異常,因為它最終會使您的應用程序進入可能無效的狀態。

正如@casperOne在他的評論中指出的那樣,這個例外在.NET 4.0中被標記為過時,盡管這並不一定意味着GC仍然無法進入導致它在.NET 3.5中引發異常的相同狀態。 如果GC確實進入同一狀態,則運行時將發出FailFast命令並終止而不是拋出異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM