【问题标题】:.NET Garbage Collection.NET 垃圾收集
【发布时间】:2009-11-27 17:08:12
【问题描述】:

假设我有两个对象:

对象1,对象2

当我执行以下分配时:

object2.Foo = object1.Foo; //Edit: where Foo is a reference type

垃圾收集器是做什么的:

  1. 它是否收集 object1,同时保留分配给 object2.Foo 的值?
  2. 或者,由于 object2.Foo 引用了 object1.Foo,object1 是否会持续存在直到 object2 被收集?
  3. 或者垃圾收集是否做一些完全不同的事情,如果是,请解释一下?

谢谢!

【问题讨论】:

  • Foo 是对象还是值类型?
  • 您的问题令人困惑,因为它以谎言开头。 “假设我有两个对象”。好的,这两个对象是什么?在我看来,您有四个对象——object1 引用的对象、object2 引用的对象、object1.Foo 引用的对象和object2.Foo 引用的对象。有两个对象,还是四个?

标签: c# .net garbage-collection


【解决方案1】:

代码

object2.Foo = object1.Foo;

object1object2 的状态没有影响。它可能对object2.Foo 的旧值产生影响。如果不存在对它的其他引用,则 object2.Foo 引用的对象现在可能是可收集的。

【讨论】:

    【解决方案2】:

    假设Foo 是一个带有后备存储的字段或属性,您将有一个类似于此的对象图(其中引用从左到右):

         object1
        /       \
    root         foo
        \       /
         object2
    

    如果您对object2 的最后引用超出范围,那么您有这个:

         object1
        /       \
    root         foo
                /
         object2
    

    在对象图中从根开始无法到达的任何东西都是垃圾收集的公平游戏,因此可以收集object2。但是,foo 仍可通过object1 访问,因此不会被收集。

    【讨论】:

    • “公平游戏”是可收集垃圾的技术术语吗?应该是!
    • 正确,但“如果 ... object2 超出范围”不是问题。
    【解决方案3】:

    如果没有更多对对象的引用,它最终会收集对象 1。 Foo 不绑定到 object1。如果 Foo 是一个引用对象,那么它将存储在堆上,而 object1 恰好存储了一个指向 Foo 的指针。如果 Foo 是一个值类型,那么当你将它分配给 object2 时会创建一个副本,并且 object1 的 Foo 与 object1 一起被销毁。

    当不再存在对该对象的引用时,该对象会在某个时刻被销毁。当类被收集时,类中引用的对象被销毁的唯一情况是类是指向特定引用的唯一指针。

    在下图中,您可以看到即使某些对象非常旧,但它们不会被收集,因为它们仍然被引用。但是,由于不再被引用,新创建的对象确实会被 GC 处理。


    (来源:chaoticjava.com

    【讨论】:

    • 这不是漫画所描述的分代垃圾收集的准确描述。分代垃圾收集器将标记在一定数量的收集过程中幸存下来的对象(通常只有 1 个过程),这样它就知道不会浪费太多时间来收集它们。大多数垃圾将始终是已分配、使用一次且不再需要的对象,因此任何超过单个收集的对象都不太可能被收集。垃圾收集器仍然会偶尔检查旧对象的可回收性,只是不像新对象那样频繁。
    【解决方案4】:

    您只是再次引用Foo。这与object1 完全无关。一旦对object1 的所有引用超出范围,object1 将被收集。 Foo 完全分开收集。

    编辑:当然,假设 foo 是一个引用类型。

    【讨论】:

      【解决方案5】:

      Object2.FooObject1.Foo会引用同一个对象,也就是Object1.Foo原来指向的对象。 Object2.Foo 之前引用的对象将在下次运行时被垃圾收集器收集(这是假设 Foo 的类型是类而不是结构)。

      【讨论】:

        【解决方案6】:

        这里的答案似乎忽略了如果 object1.foo 曾经有一个对象(而不是 null 值),那么除非其他东西(object3.foo?)使用相同的对象,否则垃圾回收会发生任何事情。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-06-16
          • 2010-10-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多