使用WeakReference的使用单声道2.11.3(SGEN)以及稳定的2.10.8版本失败,我测试代码。 在一个简单的像这样的代码
object obj = new object();
WeakReference wr = new WeakReference(obj);
Assert.IsTrue(wr.IsAlive);
obj = null;
GC.Collect();
Assert.IsFalse(wr.IsAlive);
第二断言将失败。 添加GC.WaitForPendingFinalizers于事无补。 这是单声道或在我的脑海中的错误? 谢谢
这是不是一个错误,但实现的细节,其中单GC从MS GC的行为不同。 在这种情况下,因为你在同一个堆栈帧创建obj对象,它发生在保守的叠加扫描代码保持活着。 在实际的代码(而不是琐碎的测试用例是这样),这是没有问题的。 如果您的具体情况是这样,我建议分配的对象和它在一个单独的方法WeakReference的:
static WeakReference Alloc ()
{
return new WeakReference (new object ());
}
[MethodImpl((MethodImplOptions.NoInlining)]
static WeakReference Alloc ()
{
return new WeakReference (new object ());
}
必须确保Alloc()
方法不在线时,编译