【问题标题】:What will Garbage Collector will do in this case? [duplicate]在这种情况下,垃圾收集器会做什么? [复制]
【发布时间】:2012-02-07 12:27:12
【问题描述】:

我试图了解 GC 将如何作用的两种情况

1- 有两个对象 - object1 和 object2 object1 在 object2 上有引用,object2 在 object1 上有引用 现在,这两个对象都没有被使用,GC 可以收集它们。

会发生什么? GC 会跳过这个集合吗? ?

2- 相同的问题,但我们有 4 个(或 n 个)对象相互引用。 GC 会在这种情况下做什么???

【问题讨论】:

    标签: c# .net c#-4.0 garbage-collection clr


    【解决方案1】:

    与 COM 不同,公共语言运行时不使用引用计数来管理对象生命周期。相反,垃圾收集器会跟踪对象引用并识别运行代码无法再访问的对象。

    这大大简化了组件编程,因为您不必担心循环引用。 如果一组对象包含相互引用,但这些对象都没有直接或间接地从堆栈或共享变量中引用,那么垃圾回收将自动回收内存

    http://msdn.microsoft.com/en-us/library/0t81zye4(v=vs.71).aspx

    【讨论】:

      【解决方案2】:

      .NET 使用的 GC 是 tracing garbage collector(“Mark and Sweep”是相关术语)

      如果无法再通过来自程序内存的非垃圾部分的指针/引用来访问内存对象,则将其视为“垃圾”。

      为了确定什么是可达的,什么是不可达的,GC 首先建立一组根引用/指针。这些是保证可以访问的引用。示例包括局部变量和静态字段。

      然后它递归地跟踪这些引用(跟踪)并将遇到的每个对象标记为“非垃圾”。一旦它的引用用完,它就会进入“清扫”阶段,在这个阶段,所有没有被标记为“非垃圾”的对象都会被释放(这可能包括调用对象的终结器)。

      因此,只要“活动”对象的任何部分都没有引用“对象环”中的任何对象,它就会被垃圾回收。

      【讨论】:

        【解决方案3】:

        AFAIK,GC 只会收集不再有任何引用的对象。所以只要某个对象有对它的引用,它就不会被收集。

        如果对象存在的时间足够长,它们将最终进入收集周期的下一个阶段。

        【讨论】:

          【解决方案4】:

          我不确定,但您可以通过创建大量对象(4 个线程,填充列表)然后将列表清空来尝试。 如果 ram 发生故障,它知道不再有对被引用对象块的引用,如果没有,它就不会:)

          【讨论】:

            【解决方案5】:

            Does the CLR garbage collection methodology mean it's safe to throw circular object references around? 的副本。 .NET 的 GC 不是引用计数器,它遍历所有分配的对象并尝试将它们链接到 GC 根对象。它可以处理和处置这些循环引用,无论它们有多少。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-03-06
              • 2017-12-24
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多