对使用Mono 2.11.3(SGen)和稳定的2.10.8版本的我来说,使用WeakReference的测试代码失败了。在像这样的简单代码中
object obj = new object();
WeakReference wr = new WeakReference(obj);
Assert.IsTrue(wr.IsAlive);
obj = null;
GC.Collect();
Assert.IsFalse(wr.IsAlive);
第二个断言将失败。添加GC.WaitForPendingFinalizers没有帮助。这是Mono中的错误还是我脑子里的错误?感谢
这不是一个bug,而是一个实现细节,其中Mono 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()
方法不内联