我想使用GCHandle
来监视对象是否在GC之后被收集,所以我在Release模式下运行下面的代码,而不是在Deubg模式下(它将对象的生命周期延长到方法的末尾)
internal class Program
{
static void Main(string[] args)
{
var person = new Person();
var handle = GCHandle.Alloc(person, GCHandleType.Weak);
person = null; // don't really need to set it to null because of JIT compiler's feature, but I still set it null here
GC.Collect(); // <------------------ person object should be GCed as `person` is not referenced anymore
Console.WriteLine(handle.IsAllocated); // print 'true'
Console.ReadLine();
}
}
public class Person { }
并且输出仍然打印true
,这意味着person
在GC之后仍然存在,这怎么可能呢?更让我困惑的是,GCHandle
和它的内部字段IntPtr
都是结构体,这意味着IntPtr
在GC之后不会为零,因为IntPtr
的前一个值已经存储在用户的堆栈中,那么如何使用GCHandleType.Weak
正确地监视它呢?
1条答案
按热度按时间dy2hfwbg1#
GC确实收集了Person对象,但是“IsAllocated”引用的是句柄而不是person对象。
输出: