可释放队列和终结队列

时间:2015-08-25 14:19:20

标签: .net memory-management garbage-collection garbage

可分离队列和终结队列有什么区别? 一个解决方案:Transition from Finalization Queue to FReachable Queue .net Garbage Collection

1 个答案:

答案 0 :(得分:2)

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

参考:What do you know about Freachable queue?

  

Freachable什么?你可能会问。 Freachable(发音为F-reachable)是   CLR垃圾收集器内部结构之一   垃圾收集的最终部分。你可能听说过   Finalization队列,其中每个对象都需要完成   土地最初。这取决于他是否有Finalize   方法,或者它的对象类型包含Finalize方法定义   说得更准确。这似乎是个好主意,GC希望保留   跟踪他需要调用Finalize的所有对象,以便何时进行   他收集他可以轻松找到他们。为什么他需要另一个   然后收集?

     

当他发现垃圾对象打开时GC显然是这么做的   可终结队列比您预期的要复杂一些。 GC   不直接调用Finalize方法,而是删除对象   从Finalizable队列引用并将其放在a(等待它......)   可分队列。很奇怪,是吗?事实证明,有一个专门的   CLR线程只负责监视Freachable   队列,当GC在那里添加新项目时,他开始使用对象   一个并称之为Finalize方法。关于它的一个重要观点是   你不应该依赖同样调用的Finalize方法   线程作为你的其他应用程序,不要指望线程本地存储等。

     

但我更感兴趣的是为什么?那篇文章没有给出一个   回答这个问题,但有两件事情在我脑海中浮现。第一   是性能,你显然希望垃圾收集为   尽可能快地完成大量的工作。   似乎很自然地保持像完成处理这样的辅助任务   一个后台线程,这样主要的一个可以尽可能快。   其次,但同样重要的是,Finalize毕竟是一个客户   从GC的角度来看,CLR无法真正信任亲爱的读者   实现。也许你的Finalize会抛出异常或将会发生   进入无限循环?这不是你想成为GC的一部分   过程,如果它只影响背景,它就不那么危险了   线程。