Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net freachable队列和finalization队列_.net_Memory Management_Memory Leaks_Garbage Collection_Garbage - Fatal编程技术网

.net freachable队列和finalization队列

.net freachable队列和finalization队列,.net,memory-management,memory-leaks,garbage-collection,garbage,.net,Memory Management,Memory Leaks,Garbage Collection,Garbage,freachable队列和finalization队列的区别是什么? 一种解决方案:两个队列都用于管理可终结对象 参考: 雀斑什么?你可能会问。Freachable(发音为F-reachable)是 在中使用的CLR垃圾收集器内部结构之一 垃圾收集的终结部分。你可能听说过 需要终结的每个对象所在的终结队列 最初降落。这取决于他是否有最终决定权 方法,或其对象类型包含要 说得更准确些。这似乎是一个好主意,GC希望 跟踪他需要调用Finalize的所有对象,以便 他收集资料,很容易找到。为什么他还需

freachable队列和finalization队列的区别是什么?
一种解决方案:

两个队列都用于管理可终结对象

参考:

雀斑什么?你可能会问。Freachable(发音为F-reachable)是 在中使用的CLR垃圾收集器内部结构之一 垃圾收集的终结部分。你可能听说过 需要终结的每个对象所在的终结队列 最初降落。这取决于他是否有最终决定权 方法,或其对象类型包含要 说得更准确些。这似乎是一个好主意,GC希望 跟踪他需要调用Finalize的所有对象,以便 他收集资料,很容易找到。为什么他还需要另一个 那要收藏吗

很明显GC在发现一个打开的垃圾对象时会做什么 可终结队列比您预期的要复杂一些。GC 不直接调用Finalize方法,而是删除对象 来自可终结队列的引用,并将其置于(等待它…) Freachable队列。奇怪吧?事实证明有一个专门的 CLR线程,仅负责监视Freachable 当GC在队列中添加新项目时,他会加入,并将对象作为一个对象 并调用它的Finalize方法。关于这一点,有一点很重要 您不应该依赖于Finalize方法被同一用户调用 线程作为应用程序的其余部分,不要指望线程本地存储等

但我更感兴趣的是为什么?嗯,这篇文章没有给出一个答案 回答这个问题,但我想到两件事。弗斯特 就性能而言,您显然希望垃圾收集 尽可能快,并且为此投入了大量工作。 将诸如定稿之类的次要任务交给客户处理似乎很自然 一个后台线程,以便主线程可以尽可能快地运行。 第二,但同样重要的是,Finalize毕竟是一个客户 从GC的角度来看,CLR不能真正信任您亲爱的读者 实施可能您的Finalize将抛出异常或将退出 进入无限循环?你不想成为GC的一部分 在这个过程中,如果它只影响背景,那么危险性就会小得多 线