为什么会GC.添加内存压力死锁/挂起

本文关键字:死锁 挂起 压力 内存 GC 添加 为什么 | 更新日期: 2023-09-27 18:34:15

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


我有一个使用 .NET4 在调用中无限期地死锁/挂起

GC.AddMemoryPressure(12000000)

由于它是一个生产应用程序,我无法真正共享任何代码 - 但是我想获得一些关于可能构成 GC 的提示。添加内存压力挂起。

为什么会GC.添加内存压力死锁/挂起

感谢您的输入。

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

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

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

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

来自文档的提示:

您必须确保准确消除压力 加。如果不这样做,可能会对 长时间运行的应用程序中的系统。

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

AddMemoryPresureRemoveMemoryPreasure

顺便说一下,建议您在分配大量非托管资源时使用,以这种方式向GC发出信号,表明它还必须占用大量内存。

在众多的案件中,简单的Dispose()Finalize()正确的管理就足够了。

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