2012-05-15 118 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。