微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决哪个线程在.net 中运行垃圾收集?

以下是一本书的引述:

一个线程分配一个将第 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 的标准垃圾回收,在专用线程上运行。

Microsoft 的 Background garbage collection 文章指出:

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

(...)

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

Background workstation garbage collection

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

Background server garbage collection

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。