堆栈&堆&垃圾收集器
标题可能有点不正确,然而它关于堆栈和堆和垃圾收集器没有那么少。
我的代码:
static void Main(string[] args)
{
MyInt x = new MyInt();
x.MyValue = 3;
MyInt y = new MyInt();
y = x;
y.MyValue = 4;
Console.Read();
}
public class MyInt
{
public int MyValue;
}
我的问题:
难道我理解这是正确的,在第一y
与它的指针到新创建的MyInt
在内存中,然后y
指针被取代x
指针现在y
为指向同一个对象(其所谓的对象吧?) x
的内存?
而且现在y
的对象现在是在堆栈之前创建的,没有指向它的指针? 它存在于堆中,但没有人在内存中指向这个对象。 那现在这个对象是垃圾收集器的主题?
我得到这个正确的?
你是对的。 而好的是你可以通过使用WeakReference
来证明它。
WeakReference
是跟踪另一个引用的对象,但不阻止它被收集。 这允许您随时检查您的目标参考,并查看它是否已被收集:
private static void Main(string[] args)
{
MyInt x = new MyInt();
x.MyValue = 3;
MyInt y = new MyInt();
WeakReference reference = new WeakReference(y);
Console.WriteLine("Y is alive: " + reference.IsAlive);
y = x;
y.MyValue = 4;
Console.WriteLine("Y is still alive: " + reference.IsAlive);
Console.WriteLine("Running GC... ");
GC.Collect(2);
GC.WaitForFullGCComplete();
Console.WriteLine("Y is alive: " + reference.IsAlive);
Console.Read();
}
这段代码证明了你的观点,输出如下:
Y is alive: True
Y is still alive: True
Running GC...
Y is alive: False
是的,你的解释是正确的。 首先,变量x
和y
指向不同的值 - a
和b
。 然后他们指向相同的值a
。 因此,没有强烈的b
引用,所以它可以被选为垃圾收集。