垃圾收集器如何收集其他对象内部的内部对象?

时间:2019-06-11 13:45:41

标签: c# .net

假设我们有两个A类和B类:

class A
{
   public B b;
   public A()
   {
       b = new B();
   }
}

class B
{

}

以及在main方法中:

static void Main(string[] args)
{
  TestMethod();
  //timestamp 2
  string[] StrList = new String[999999]; // Make a ton of objects to trigger Garage Collection in an attempt to free up memory
}

static void TestMethod() 
{
   A a = new A();
   //timestamp 1
}

因此在时间戳1中,内存将类似于:

enter image description here

,在时间戳2中,内存将类似于: enter image description here

,然后触发GC。我不太了解的第一件事是,GC如何释放实例new B()?因为b仍指向它,并且GC不会收集仍被引用的对象?

如果新的B()必须是免费的,那么哪个是第一个免费的,那么新的A()还是新的B()?

1 个答案:

答案 0 :(得分:0)

关于GC如何收集东西的最简单解释是:

  1. 检查所有static字段是否具有引用并收集其引用
  2. 丢掉所有未找到的东西

aka:

{
    var a = new A();
    var b = new B();
    b.a_ref = a;
    a.b_ref = b;
}
一旦离开范围,

可以获取GC,因为没有静态字段引用它。

有关此的更多信息:https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/