gpt4 book ai didi

c# - 循环引用对象的垃圾回收

转载 作者:太空狗 更新时间:2023-10-29 21:34:27 29 4
gpt4 key购买 nike

假设我有 2 个对象 - 对象 A 和对象 B。对象 A 引用对象 B,对象 B 引用对象 A。

  1. 如果对象 A 和对象 B 都在代码的引用之外 - 垃圾收集器如何知道它可以被收集。
  2. 垃圾收集器如何推断任何对象超出范围/准备好进行垃圾收集?
  3. 如果对象 A 未被我们的代码引用但仍然可以独立怎么办。例如。如果它是一个 Form 类,那么它可以独立运行,即使对象 A 被重新初始化为一个新实例或指定为 null。

最佳答案

  1. GC 不会选择一个对象并查看是否有任何引用它;如果可以,请保留它。 GC 有一个它知道“活着”的每个对象的集合。这个集合以所有静态变量、堆栈上的所有变量和一些其他特殊情况开始。然后它遍历每个“事件”对象并查看它们引用的对象。每个引用的对象本身都标记为“事件”,因为这意味着它可以通过其他事件对象以某种方式访问​​。它重复这个过程,直到没有新的对象被发现。任何没有被标记为事件的东西都被认为是不可访问的。如您所知,由于您从未检查过任何给定的“死”对象引用是什么,因此是否存在循环引用无关紧要。

  2. 参见 #1。

  3. 好吧,在大多数情况下,它实际上在某处被引用;例如,对于表单,您有 Application.OpenForms 引用任何打开的表单。对于诸如此类的对象,通常存在类似的结构。在极少数情况下,对于诸如计时器之类的对象,GC 会明确告知不要收集它们。这种情况非常很少见,您通常不需要担心。

关于c# - 循环引用对象的垃圾回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16595256/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com