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