当前位置: 首页 > 知识库问答 >
问题:

具有挂起终结器的对象是否需要由GC收集不止一次?

赫连冠玉
2023-03-14

共有1个答案

齐鹏程
2023-03-14

嗯,对象不是第一次被‘收集’的。它们被认为需要额外的处理(终结器代码需要运行),并放在终结队列中,以便可以单独处理它们。这最终会将它们放在“freachable”队列中,该队列现在已经复活了对象:它现在被freachable队列引用,不再符合收集的条件。在终结器实际执行并且对象从freachable队列中移除之后,它将不可访问。

(这是它过去的工作方式,不确定在较新的.NET版本中是否有变化,但我不知道有任何变化。)

因此,对象并不是真正的“收集”不止一次,如果通过“收集”我们理解内存被回收了。然而,它确实需要额外的处理,并将由GC在稍后的时间点再次重新评估。

 类似资料:
  • 本文向大家介绍GC中如何判断对象是否需要被回收?相关面试题,主要包含被问及GC中如何判断对象是否需要被回收?时的应答技巧和注意事项,需要的朋友参考一下 考察点:JAVA虚拟机 即使在可达性分析算法中不可达的对象,也并非是“非回收不可”的,这时候它们暂时处于“等待”阶段,要真正宣告一个对象回收,至少要经历两次标记过程:如果对象在进行可达性分析后发现没有与GC Roots相连接的引用链,那它将会被第一

  • 我已经读到,在以下情况下,对象可以进行垃圾收集。 该对象的所有引用都显式设置为null 但是,是否有无论如何要标识的对象是合格的垃圾回收机制是由垃圾收集器收集?

  • 我正在读杰弗里·里克特的书“通过C#进行CLR”。它是从那里引用的: Finalize方法在GC确定为垃圾的对象的垃圾收集完成时调用。这意味着不能立即回收这些对象的内存,因为Finalize方法可能执行访问字段的代码。因为一个可终结的对象必须在集合中存活,所以它会被提升到另一个世代,从而迫使该对象比它应该存活的时间长得多

  • 昨天,我们讨论了垃圾收集。 有人讨论过,使用类创建的对象由垃圾收集器收集,但如果是使用struct创建的,则不能由GC收集 我知道结构使用堆栈,类使用堆。 但是,我猜GC永远不会只收集非托管代码。这是否意味着结构类型是非托管代码。(我不这么认为)。 还是GC只负责堆而不负责堆栈? 如果是,那么int数据类型呢。int是struct而不是class。那么,如果我们定义int类型的对象,它不是由GC管

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