【问题标题】:which thread run garbage collection in .net? [duplicate]哪个线程在.net 中运行垃圾收集? [复制]
【发布时间】:2021-07-02 20:53:15
【问题描述】:

以下是一本书的引述:

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

假设我们有3个并发线程,threa 1、threa 2和thead 3,在某个时间点,线程3分配了一个新的对象到heap,导致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 代对象?

【问题讨论】:

标签: c# .net clr


【解决方案1】:

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

微软的Background garbage collection 文章指出:

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

(...)

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

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

【讨论】:

  • 我知道 CLR 使用专用线程来收集第 2 代对象,这个问题是关于第 0 代和第 1 代的收集,为什么不也使用专用线程来收集第 0 代和第 1 代对象?跨度>
  • 它确实在服务器服务器(与工作站)垃圾收集中的专用线程上运行。
  • 您发布的链接说:“后台垃圾收集在一个或多个专用线程上执行,具体取决于它是后台还是服务器 GC,并且仅适用于第 2 代收集。”所以专用线程只适用于第2代集合,而不是第0代或第1代
猜你喜欢
  • 2011-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多