我正在阅读第12章:C# in a Nutshell
的垃圾收集,其中Concurrent and background collection
部分说明了
GC必须在执行期间冻结(阻止)执行线程 采集。这包括Gen0或者Gen0期间的整个期间 Gen1收集发生。
我理解的一点是;可能是它试图在那个时间点避免任何新的内存分配。
这背后还有其他具体原因 - 为什么GC需要阻止当前正在执行的线程?
答案 0 :(得分:1)
MSDN文档声称第0代和第1代始终执行non-concurrently because they happen very fast。
执行并发垃圾收集传递将花费比非并发传递更长的时间,因为必须在GC线程和其他线程之间同步对正在处理的数据的访问。这增加了开销,这可能超过了第0代和第1代集合中并发性的好处,因为它们通常运行速度非常快。
除了删除从内存中标记的对象之外,GC在执行传递后也tries to compact the heap。这意味着对象可能会因GC传递而在内存中移动。因此,并发传递需要额外的开销来同步GC线程和进程的其他线程之间的数据访问。