解決:事實證明,受影響的機器安裝了.NET 4.5 Beta。GC.AddMemoryPressure爲什麼會死鎖/掛起?
我有使用.NET4一個C#應用程序死鎖/在呼叫無限期掛起到
GC.AddMemoryPressure(12000000)
因爲它是一個生產程序,我真的不能共享任何代碼 - 不過,我想想要了解一些可能導致GC.AddMemoryPressure掛起的提示。從文檔
解決:事實證明,受影響的機器安裝了.NET 4.5 Beta。GC.AddMemoryPressure爲什麼會死鎖/掛起?
我有使用.NET4一個C#應用程序死鎖/在呼叫無限期掛起到
GC.AddMemoryPressure(12000000)
因爲它是一個生產程序,我真的不能共享任何代碼 - 不過,我想想要了解一些可能導致GC.AddMemoryPressure掛起的提示。從文檔
感謝您的輸入。
事實證明,受影響的機器安裝了.NET 4.5 Beta。
由於一個核心完全飽和,它似乎沒有死鎖。對AddMemoryPressure的調用似乎最終發生在從未返回的函數clr!CNameSpace :: GcScanRoots中。
卸載4.5測試版並安裝.NET 4似乎已解決了此問題。
如果這確實是問題,那麼我確信希望MS在發佈前修復它。
看起來它可能仍然是.Net 4.5 RTM中的一個問題。 – codekaizen
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
提示:
你必須確保你刪除正是你 加壓力量。否則可能會對長時間運行的應用程序中的 系統的性能產生不利影響。
這意味着,你必須非常小心在這兩個電話之間的平衡:
AddMemoryPresure
和RemoveMemoryPreasure
這,順便說一下,建議在你分配的情況下使用大量的非託管資源,以這種方式發信號GC
關於它也必須計入內存的事實。
在浩瀚的案件中,簡單的Dispose()
, Finalize()
正確的管理就足夠了。
我不會弄亂手動GC。確保您的資源在使用後被處置並完成。 GC手動可以擰緊繫統。只要程序中的對象被刪除,.NET就很好地管理GC。
您是否有匹配的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
爲什麼會有人倒下投票這個問題沒有評論? – codekaizen