为什么GC.AddMemoryPressure会死锁/挂起?

时间:2012-05-15 07:33:12

标签: c# .net garbage-collection

已解决:事实证明受影响的计算机已安装.NET 4.5测试版。


我有一个使用.NET4的C#应用​​程序,在对

的调用中无限期地死锁/挂起
GC.AddMemoryPressure(12000000)

由于它是一个生产中的应用程序,我无法真正共享任何代码 - 但是我想得到一些关于可能使GC.AddMemoryPressure挂起的提示。

3 个答案:

答案 0 :(得分:2)

文档提示:

  

您必须确保准确删除您的压力   加。如果不这样做会对性能产生不利影响   系统在长时间运行的应用程序中。

这意味着你必须非常非常小心平衡这两个电话:

AddMemoryPresureRemoveMemoryPreasure

顺便说一下,建议在你分配大量非托管资源的情况下使用它,以这种方式发信号通知GC它必须接受的事实还算一下记忆的失落。

在极大的案例中,简单的Dispose()Finalize()正确的管理就足够了。

答案 1 :(得分:2)

感谢您的意见。

事实证明,受影响的计算机安装了.NET 4.5 beta。

由于一个核心完全饱和,似乎没有陷入僵局。对AddMemoryPressure的调用似乎最终出现在从未返回的函数clr!CNameSpace :: GcScanRoots中。

卸载4.5 beta并安装.NET 4似乎解决了这个问题。

如果这确实是问题,那么我肯定希望MS在发布之前修复它。

答案 2 :(得分:1)

我不会弄乱手动GC。确保您的资源在使用后处理完毕并完成。 GC手动可以搞砸系统。只要在程序中删除了对象,.NET就可以很好地管理GC。