是什么让 C# 垃圾收集变慢?

What makes C# Garbage Collection slow?

我想知道以下哪些参数对 GS 的性能影响最大:

具体来说,其中哪些决定了 CPU 冻结所有线程以进行清理的时间。我想我希望对象的数量只会在 执行 期间导致更多的工作,但不会延长冻结的持续时间。就像把垃圾装进袋子可能需要更多时间,如果有更多垃圾,但是把袋子扔进垃圾箱(或其他什么)需要同样长的时间,(几乎)不管里面有多少东西。

这个想法是不是太天真了?

这个问题没有单一的答案,但是 .NET GC 的首席开发人员 Maoni Stephens 给出了一个一般性的 "The one rule to remember"

"存活下来的通常决定GC需要做多少工作;存活下来的通常决定GC触发的频率。"

“GC 需要做多少工作”和它引入的暂停之间的关系(似乎您最关心的是这方面)是另一回事,并且在很大程度上取决于具体的 GC 实现。

我觉得你对 GC 内部原理很感兴趣,我强烈建议你阅读链接文档并观看我的 ".NET GC Internals" 系列。