2012-05-15 147 views
4

解決:事實證明,受影響的機器安裝了.NET 4.5 Beta。GC.AddMemoryPressure爲什麼會死鎖/掛起?


我有使用.NET4一個C#應用程序死鎖/在呼叫無限期掛起到

GC.AddMemoryPressure(12000000) 

因爲它是一個生產程序,我真的不能共享任何代碼 - 不過,我想想要了解一些可能導致GC.AddMemoryPressure掛起的提示。從文檔

+0

您是否有匹配的RemoveMemoryPressure調用? http://blogs.msdn.com/b/jmeier/archive/2006/10/09/performance-guideline_3a00_-use-addmemorypressure-while-consuming-unmanaged-objects-through-com-interop.aspx – ChristopheD

+0

爲什麼會有人倒下投票這個問題沒有評論? – codekaizen

回答

2

感謝您的輸入。

事實證明,受影響的機器安裝了.NET 4.5 Beta。

由於一個核心完全飽和,它似乎沒有死鎖。對AddMemoryPressure的調用似乎最終發生在從未返回的函數clr!CNameSpace :: GcScanRoots中。

卸載4.5測試版並安裝.NET 4似乎已解決了此問題。

如果這確實是問題,那麼我確信希望MS在發佈前修復它。

+0

看起來它可能仍然是.Net 4.5 RTM中的一個問題。 – codekaizen

+0

https://connect.microsoft.com/VisualStudio/feedback/details/765811/visual-studio-hangs-when-the-xaml-designer-proc-xdesproc-hangs-due-to-system-gc-addmemorypressure-not -returning – codekaizen

2

提示:

你必須確保你刪除正是你 加壓力量。否則可能會對長時間運行的應用程序中的 系統的性能產生不利影響。

這意味着,你必須非常小心在這兩個電話之間的平衡:

AddMemoryPresureRemoveMemoryPreasure

這,順便說一下,建議在你分配的情況下使用大量的非託管資源,以這種方式發信號GC關於它也必須計入內存的事實。

在浩瀚的案件中,簡單的Dispose(), Finalize()正確的管理就足夠了。

1

我不會弄亂手動GC。確保您的資源在使用後被處置並完成。 GC手動可以擰緊繫統。只要程序中的對象被刪除,.NET就很好地管理GC。