Tag: 弱引用

垃圾收集应该已经删除了对象,但WeakReference.IsAlive仍然返回true

我有一个测试,我希望通过,但垃圾收集器的行为不是我所假设的: [Test] public void WeakReferenceTest2() { var obj = new object(); var wRef = new WeakReference(obj); wRef.IsAlive.Should().BeTrue(); //passes GC.Collect(); wRef.IsAlive.Should().BeTrue(); //passes obj = null; GC.Collect(); wRef.IsAlive.Should().BeFalse(); //fails } 在这个例子中, obj对象应该是GC’d,因此我希望WeakReference.IsAlive属性返回false 。 似乎因为obj变量声明在与GC.Collect相同的范围内,所以它没有被收集。 如果我在方法之外移动obj声明和初始化,则测试通过。 有没有人对此行为有任何技术参考文档或解释?

WeakReference是否可以提供良好的缓存?

我有一个缓存,它使用WeakReferences到缓存的对象,以便在内存压力的情况下自动从缓存中删除它们。 我的问题是缓存的对象在存储到缓存后很快就会被收集。 缓存在64位应用程序中运行,尽管有超过4gig的内存仍然可用,但所有缓存的对象都被收集(它们通常在那时存储在G2堆中)。 进程资源管理器显示没有手动引发的垃圾收集。 我可以采用哪些方法让对象更长寿?

是否有可能在C#中创建一个真正弱键的字典?

我正试图为C#确定一个真正的WeakKeyedDictionary的细节……但我遇到了困难。 我意识到这是一个非常重要的任务,但似乎无法声明WeakKeyedKeyValuePair (如果密钥可达,GC只跟随值引用)使得它看起来似乎不可能。 我看到两个主要问题: 到目前为止,我所看到的每个实现都没有在收集密钥后修剪值。 考虑一下 – 使用这样一个词典的主要原因之一是防止这些值被保留(不仅仅是键!),因为它们无法访问,但在这里它们被强引用指向。 是的,在词典中添加/删除足够多,它们最终会被替换,但如果你不这样做呢? 如果没有假设的WeakKeyedKeyValuePair (或者告诉GC只在密钥可达时标记值的其他方法),任何引用它的密钥的值都不会被收集。 存储任意值时,这是一个问题。 问题1可能以相当不理想/不熟练的方式解决:使用GC通知等待完整的GC完成,然后继续并在另一个线程中修剪字典。 这个我半熟。 但问题2让我难过。 我意识到这很容易被“所以不要这样做”所抵消,但它让我感到疑惑 – 这个问题甚至可以解决吗?