Ian*_*oyd 9 .net clr garbage-collection object-lifetime
问:有没有办法找出一个对象是否有任何"强引用"?
Raymond Chen暗示可能有一种解决方案:
您想知道引用计数是零还是非零.为此,请使用WeakReference.
此代码示例演示了依赖强制执行垃圾收集的问题以及WeakReference的IsAlive
属性,以确定对象是否有任何未完成的引用.
WeakReference m_wr = null;
...
for (int i = 0; i < 1000000; i++)
{
Pig p = new Pig();
m_wr = new WeakReference(p);
}
...
GC.Collect();
if (m_wr.IsAlive)
Environment.FailFast("All objects should have been collected by now");
Run Code Online (Sandbox Code Playgroud)
不,不是没有使用调试器API.
正如你所说,对象不是引用计数...所以找出的唯一方法是爬行堆,这通常只是作为垃圾收集的一部分发生.
请注意,即使在没有"正常"强引用之后,对象也可以作为最终化的一部分复活 - 如果终结器队列有终结器,则终结器队列有效地引用它.也许你不希望在这种情况下将对象包含为"无参考".