假设我们有两个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中,内存将类似于:
,然后触发GC。我不太了解的第一件事是,GC如何释放实例new B()?因为b仍指向它,并且GC不会收集仍被引用的对象?
如果新的B()必须是免费的,那么哪个是第一个免费的,那么新的A()还是新的B()?
答案 0 :(得分:0)
关于GC如何收集东西的最简单解释是:
static
字段是否具有引用并收集其引用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/