已解决:原来受影响的机器安装了 .NET 4.5 beta。
我有一个使用 .NET4 的 C# 应用程序,它在调用中无限期地死锁/挂起
GC.AddMemoryPressure(12000000)
由于它是一个生产中的应用程序,我无法真正共享任何代码 - 但是我想获得一些关于可能导致 GC.AddMemoryPressure 挂起的提示。
已解决:原来受影响的机器安装了 .NET 4.5 beta。
我有一个使用 .NET4 的 C# 应用程序,它在调用中无限期地死锁/挂起
GC.AddMemoryPressure(12000000)
由于它是一个生产中的应用程序,我无法真正共享任何代码 - 但是我想获得一些关于可能导致 GC.AddMemoryPressure 挂起的提示。
来自文档的提示:
您必须确保完全消除您添加的压力。如果不这样做,可能会对长时间运行的应用程序中的系统性能产生不利影响。
这意味着您必须非常小心地平衡这两个调用:
AddMemoryPresure
和RemoveMemoryPreasure
顺便说一句,建议在分配大量非托管资源时使用它,以这种方式GC
表明它还必须计算内存量。
在绝大多数情况下,简单Dispose()
、Finalize()
正确的管理就足够了。
感谢您的输入。
事实证明,受影响的机器安装了 .NET 4.5 beta。
似乎没有陷入僵局,因为一个核心已经完全饱和。对 AddMemoryPressure 的调用似乎最终出现在从未返回的函数 clr!CNameSpace::GcScanRoots 中。
卸载 4.5 beta 并安装 .NET 4 似乎已经解决了这个问题。
如果这确实是问题,那么我当然希望 MS 在发布之前修复它。
我不会搞乱手动GC。确保您的资源在使用后被处理并完成。GC 手动可以搞砸系统。只要在程序中删除对象,.NET 就可以很好地管理 GC。