Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 哪个线程在.net中运行垃圾收集?_C#_.net_Clr - Fatal编程技术网

C# 哪个线程在.net中运行垃圾收集?

C# 哪个线程在.net中运行垃圾收集?,c#,.net,clr,C#,.net,Clr,以下是一本书的引文: 当线程分配的对象将第0代推到其预算之外时,GC首先挂起所有线程,然后确定收集哪些代。如果垃圾收集器需要收集第0代或第1代,它将正常进行 假设我们有三个并发线程,threa 1、threa 2和thead 3,在某个时间点,线程3分配一个新对象到堆,这会导致第0代的预算已满,GC需要运行 我的问题是: Q1哪个线程运行GC Q2如果是线程3运行GC,我的理解是,当线程3运行GC时,首先需要保存线程3的上下文,然后停止线程1和线程2,然后执行GC,当它完成GC时,线程3需要恢复

以下是一本书的引文:

当线程分配的对象将第0代推到其预算之外时,GC首先挂起所有线程,然后确定收集哪些代。如果垃圾收集器需要收集第0代或第1代,它将正常进行

假设我们有三个并发线程,threa 1、threa 2和thead 3,在某个时间点,线程3分配一个新对象到堆,这会导致第0代的预算已满,GC需要运行

我的问题是:

Q1哪个线程运行GC

Q2如果是线程3运行GC,我的理解是,当线程3运行GC时,首先需要保存线程3的上下文,然后停止线程1和线程2,然后执行GC,当它完成GC时,线程3需要恢复它以前的线程上下文,以执行它以前在GC发生之前执行的内容。我的理解正确吗

Q3如果我对Q2的理解是正确的,那么保存和恢复线程上下文是一项昂贵的工作,为什么CLR不创建一个新的专用线程来运行GC,而不是使用现有线程来运行GC


另外,我知道CLR使用专用线程来收集第2代对象,这个问题是关于第0代和第1代收集的,为什么不也使用专用线程来收集第0代和第1代对象?

后台垃圾收集,这是在专用线程上运行的4.0ish的标准垃圾收集

Mistrosoft的文章指出:

在后台垃圾收集(GC)中,在收集第2代的过程中,根据需要收集临时生成(0和1)。后台垃圾收集在一个或多个专用线程上执行,具体取决于它是后台还是服务器GC,并且仅适用于第2代收集

(……)

下图显示了在单独的专用线程上执行的后台工作站垃圾收集:

下图显示了在单独的专用线程上执行的后台服务器垃圾收集:


我知道CLR使用专用线程来收集第2代对象,这个问题是关于第0代和第1代收集的,为什么不也使用专用线程来收集第0代和第1代对象呢?它确实在服务器(相对于工作站)垃圾收集中的专用线程上运行。您发布的链接说:“后台垃圾收集在一个或多个专用线程上执行,具体取决于它是后台还是服务器GC,并且仅适用于第2代收集。“因此,专用线程只应用第2代集合,而不是第0代或第1代。您知道,在正常操作中,线程上下文切换总是发生的,对吗?为什么您认为这一个特定的上下文切换比其他任何上下文切换都要昂贵?例如,目前在我的系统上有大约3400个线程,相信我,它们没有一个专用的处理器线程。这是否回答了你的问题?及