问。有没有办法找出一个对象是否有任何“强引用”?
Raymond Chen暗示a solution might be possible:
您想知道是否参考 count为零或非零。为了那个原因, 使用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");
答案 0 :(得分:9)
不,不是没有使用调试器API。
正如你所说,对象不是引用计数...所以找出的唯一方法是抓取堆,这通常只是垃圾收集的一部分。
请注意,即使在没有“正常”强引用之后,对象也可以作为终结的一部分复活 - 如果终结器队列有终结器,则终结器队列有效引用它。也许你不想在这种情况下将对象包含为“无参考”。
答案 1 :(得分:3)
首先致电GC.Collect()
和然后检查WeakReference.IsAlive
。如果它是true
(即,在调用 GC.Collect 之后尚未收集它),则会在某处提供强引用。
答案 2 :(得分:2)