如何判断一个对象是否已被垃圾回收

17

我怎么知道一个对象是否已经被垃圾回收了?


“重复”问题不是很具体,因此已重新开放。这个问题是一个具体的问题,有一个明确的答案。 - leppie
1个回答

47

根据这篇文章

通常情况下,无法通过对对象的引用来判断其是否已被垃圾回收,因为一旦您拥有了该对象的引用,它就不会被垃圾回收。

相反,您可以使用WeakReference对象创建一个弱引用对象。弱引用不会被计算为对垃圾回收的引用。

在下面的代码中,我们在垃圾回收前后进行检查,以显示Dog对象已被垃圾回收。

Dog dog = new Dog("Bowser");

WeakReference dogRef = new WeakReference(dog);
Console.WriteLine(dogRef.IsAlive);

dog = null;
GC.Collect();

Console.WriteLine(dogRef.IsAlive);

在此输入图片描述


这个技巧在对一些手工制作的容器进行单元测试时非常有用,特别是在使用“Clear”方法时。 - Denis Gladkiy
3
在调试模式下这个技巧可能会失效:所有本地对象都会被“挂钩”直到方法结束。因此,如果您正在编写某种单元测试,则应将上述代码包装在一个方法中,并在调用包装器后检查弱引用(以及GC.Collect()的调用)。 - Denis Gladkiy
我不得不使用这三行代码来让它在GitHub actions中正常工作,尽管在本地运行时它表现得很好:GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接