C# 4.0 为什么GC(垃圾收集器)冻结当前的执行线程

C# 4.0 为什么GC(垃圾收集器)冻结当前的执行线程,c#-4.0,garbage-collection,C# 4.0,Garbage Collection,我在读第12章:垃圾收集的C 35;简言之,其中关于并发和后台收集的一节中说 GC必须在执行期间冻结(阻止)执行线程一段时间 收集这包括Gen0或 第1代收集正在进行 我理解的一件事是;可能是为了避免在那个时候出现任何新的内存分配 这背后还有其他具体原因吗?比如为什么GC需要阻止当前正在执行的线程?MSDN文档声称始终执行第0代和第1代 由于对正在处理的数据的访问必须在GC线程和其他线程之间同步,因此执行并发垃圾收集过程将比非并发垃圾收集过程花费更长的时间。这增加了开销,这可能超过了gen 0和

我在读第12章:垃圾收集的
C 35;简言之
,其中关于
并发和后台收集的一节中说

GC必须在执行期间冻结(阻止)执行线程一段时间 收集这包括Gen0或 第1代收集正在进行

我理解的一件事是;可能是为了避免在那个时候出现任何新的内存分配


这背后还有其他具体原因吗?比如为什么GC需要阻止当前正在执行的线程?

MSDN文档声称始终执行第0代和第1代

由于对正在处理的数据的访问必须在GC线程和其他线程之间同步,因此执行并发垃圾收集过程将比非并发垃圾收集过程花费更长的时间。这增加了开销,这可能超过了gen 0和gen 1集合中并发的好处,因为它们通常运行得非常快


除了从内存中删除标记的对象外,GC还可以在执行传递之后删除。这意味着对象可能由于GC传递而在内存中移动。由于这个原因,并发传递需要额外的开销来同步GC线程和进程的其他线程之间的数据访问。

Miky,你为什么删除了之前的答案。请保留它。这完全有道理,@Rahul-我已经把这部分加了回去,但我重新表述了答案,以便更好地反映MSDN上关于这个过程的可用内容。整篇文章值得一读!事实上,现在只是这样做。谢谢你指点它。