【问题标题】:Garbage collector - finalization垃圾收集器 - 完成
【发布时间】:2014-01-31 14:57:27
【问题描述】:

来自 MSDN: “当一个对象不可达时,垃圾收集器认为该对象是垃圾。然后,当垃圾收集器将一个对象的条目从终结队列移动到可访问队列时,该对象不再被认为是垃圾,它的内存也不会被回收。在至此,垃圾收集器已经完成了垃圾的识别,部分被识别为垃圾的对象已经被重新分类为非垃圾,垃圾收集器压缩可回收的内存,特殊的运行时线程清空freachable队列,执行每个对象的Finalize方法。 需要两次 GC 来回收需要终结的对象使用的内存。

我的问题 - 由于需要两次 GC 来为需要终结的对象回收内存,如果在第二次收集发生之前,需要终结的对象再次被强引用,垃圾收集器是否从 f-reachable 队列中删除该对象,使其不被垃圾收集?

【问题讨论】:

    标签: .net garbage-collection


    【解决方案1】:

    垃圾收集器是否将对象从 f-reachable 队列中移除,使其不被垃圾收集?

    是的。

    在第二次运行时它总是会从fRreachable 中删除,但是当有新的外部引用时,它将不会被收集。您需要使用GC.ReRegister() 方法再次完成它。

    整个模式被称为resurrection并且是very rarely called for。

    【讨论】:

    • @ThomasLevesque 我的错!
    • 当它们的终结器运行时,放置在 freachable 队列中的对象将从该队列中删除;我不知道 GC 试图识别 freachable 队列中的任何对象是否已通过其他方式变得强可达。
    • @supercat - 没必要。 fReachable 是根引用,适用常规规则。
    猜你喜欢
    • 2015-07-10
    • 2016-04-03
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    • 2011-11-07
    • 2013-04-01
    • 2012-06-23
    相关资源
    最近更新 更多