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

时间:2014-03-05 19:23:54

标签: c#-4.0 garbage-collection

我正在阅读第12章:C# in a Nutshell的垃圾收集,其中Concurrent and background collection部分说明了

  

GC必须在执行期间冻结(阻止)执行线程   采集。这包括Gen0或者Gen0期间的整个期间   Gen1收集发生。

我理解的一点是;可能是它试图在那个时间点避免任何新的内存分配。

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

1 个答案:

答案 0 :(得分:1)

MSDN文档声称第0代和第1代始终执行non-concurrently because they happen very fast

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

除了删除从内存中标记的对象之外,GC在执行传递后也tries to compact the heap。这意味着对象可能会因GC传递而在内存中移动。因此,并发传递需要额外的开销来同步GC线程和进程的其他线程之间的数据访问。