【发布时间】: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 代对象?
【问题讨论】:
-
您知道线程上下文切换在正常操作中一直发生,对吧?为什么你认为这个特定的上下文切换会比其他任何一个都更昂贵?例如。目前在我的系统上大约有 3400 个线程,相信我,它们并不是每个都有专用的处理器线程。