如何证明发布了弱引用?

时间:2018-07-03 08:04:06

标签: c# garbage-collection

我正在尝试测试一些使用WeakReference的代码-如何强制收集参考对象,以便reference.Target返回null

我尝试了

WeakReference reference = new WeakReference(null);
{
    reference.Target = new object();
}

Console.WriteLine(reference.Target);

GC.Collect();
Thread.Sleep(1000);

Console.WriteLine(reference.Target);

Console.ReadLine();

,但在两种情况下目标都不是null。还尝试了多次调用GC.Collect,但似乎没有任何作用。

2 个答案:

答案 0 :(得分:0)

发布版本(启用优化)中运行代码,并无需调试即可启动,垃圾收集器很好地展示了预期的行为。

如果您需要检查变量,调试器会将变量作为GC根保留在范围内。

此外,请使用通用版本WeakReference<T>。非通用API的使用存在问题,而通用API中已解决。参见:http://www.philosophicalgeek.com/2014/08/14/prefer-weakreferencet-to-weakreference/

编辑:没有刷新,并且注意到帖子很旧,评论已经对此进行了报道。

答案 1 :(得分:0)

如果一个人对弱引用的目标不感兴趣,而只是想知道它是否已经死亡,那么最好检查import pandas as pd # have to convert the series to date index dsIndex = pd.Index(df['ds']) # strip off the TZ info (assume it was <bson.tz_util.FixedOffset objec...) dsIndex = dsIndex.tz_localize(tz=None) # Reassign it to UTC dsUTC = dsIndex.tz_localize(tz='UTC') 属性是否已变成IsAlive,而不是检查false属性是否已变为Target。尽管这可能无法解决调试构建使对象存活的时间长于预期的所有问题,但可以避免出现其他一些问题,尤其是在使用并发垃圾回收时。在存在任何强引用的情况下,无法收集null的目标,因此获取WeakReference的{​​{1}}将至少暂时保护相关对象免受收集。在某些情况下代码实际上想要对所引用的对象做一些事情,这可能是不可避免的,但是如果人们只是想找出对象何时死亡,则没有理由冒险延长对象的寿命。