Mono上奇怪的WeakReference行为

act*_*ult 14 c# mono weak-references

使用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);
Run Code Online (Sandbox Code Playgroud)

第二个断言将失败.添加GC.WaitForPendingFinalizers没有帮助.这是Mono或我头脑中的错误吗?谢谢

lup*_*pus 12

这不是一个错误,而是一个实现细节,其中Mono GC的行为与MS GC不同.在这种情况下,由于您在同一堆栈帧中创建了对象obj,因此保守堆栈扫描代码恰好保持活动状态.在实际代码中(与这样的琐碎测试案例相对),这不是问题.如果对于你的特定情况,我建议在一个单独的方法中分配对象及其WeakReference:

static WeakReference Alloc ()
{
    return new WeakReference (new object ());
}
Run Code Online (Sandbox Code Playgroud)


小智 5

[MethodImpl((MethodImplOptions.NoInlining)]
static WeakReference Alloc ()
{
    return new WeakReference (new object ());
}
Run Code Online (Sandbox Code Playgroud)

Alloc()编译时必须确保方法不是内联的

  • 这个答案并没有真正回答 OP 的问题。考虑在您的答案中添加一些解释。 (2认同)