Cha*_*thJ 8

这两个队列都是为了管理可终结对象。

参考:您对可到达队列了解什么?

脆弱的是什么?你可能会问。Freachable(发音为F-reachable)是CLR Garbage Collector内部结构之一,用于垃圾收集的完成部分。您可能已经听说过终结队列,每个需要终结的对象最初都会到达该队列。这取决于他是否具有Finalize方法,或者它的对象类型包含Finalize方法定义以更准确地讲。这似乎是个好主意,GC希望跟踪需要调用Finalize的所有对象,以便在收集对象时可以轻松找到它们。那他为什么还需要另一个收藏呢?

很显然,当GC发现位于Finalizable队列中的垃圾对象时,GC的操作比您预期的要复杂一些。GC不会直接调用Finalize方法,而是从Finalizable队列中删除对象引用,并将其放在(等待它。)可访问队列中。奇怪吧?事实证明,有一个专门的CLR线程仅负责监视Freachable队列,当GC在其中添加新项时,他踢了进来,一个接一个地接收对象,并将其称为Finalize方法。重要的一点是,您不应该依赖与其他应用程序相同的线程来调用Finalize方法,也不要依赖于线程本地存储等。

但是为什么我更感兴趣?好吧,这篇文章并没有给出答案,但是我想到了两件事。首先是性能,您显然希望垃圾收集尽可能快,并且为此进行了大量工作。保留诸如终结处理之类的辅助任务由后台线程处理似乎是很自然的,这样主任务才能尽可能快。其次,但同样重要的是,从GC角度来看,Finalize毕竟是客户端代码,CLR不能真正信任您亲爱的阅读器实现。也许您的Finalize会抛出异常或进入无限循环?这不是您要成为GC流程的一部分,如果它仅影响后台线程,则危险就小得多。