4

已解决:原来受影响的机器安装了 .NET 4.5 beta。


我有一个使用 .NET4 的 C# 应用程序,它在调用中无限期地死锁/挂起

GC.AddMemoryPressure(12000000)

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

4

3 回答 3

2

来自文档的提示:

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

这意味着您必须非常小心地平衡这两个调用:

AddMemoryPresureRemoveMemoryPreasure

顺便说一句,建议在分配大量非托管资源时使用它,以这种方式GC表明它还必须计算内存量。

在绝大多数情况下,简单Dispose()Finalize()正确的管理就足够了。

于 2012-05-15T07:38:51.603 回答
2

感谢您的输入。

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

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

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

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

于 2012-05-16T07:16:13.617 回答
1

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

于 2012-05-15T07:50:20.490 回答