在.NET中集合中WeakReferences的最佳时间

时间:2011-04-23 13:54:58

标签: c# .net garbage-collection weak-references

我有一个集合(我写的是Weak Dictionary),我需要定期剔除死的WeakReferences。我经常看到的是在添加和删除方法中检查,“在对集合进行X修改之后,是时候剔除了”。这对我来说是可以接受的,但似乎应该有更好的方法。

我真的很想知道GC何时运行并立即运行我的清理代码。毕竟,GC可能是确定何时是清理死引用的好时机的最佳机制。我找到Garbage Collection Notifications,但看起来这不是我想要的。我不想仅仅为了监视GC而产生一个单独的线程。理想情况下,我的集合将实现IWantToRunCodeDuringGC或订阅System.GC.Collected事件。但.NET框架可能无法信任用户代码在GC期间运行...

或者可能还有另一种我忽视的方法。

编辑:如果我的代码在GC之后,之前或期间运行,我认为这并不重要。

3 个答案:

答案 0 :(得分:2)

我想你想创建一个弱字典作为一种“懒惰”缓存某些数据的方式。

你需要考虑GC经常发生的事实,如果没有其他对象引用它们,你的弱引用将在大多数时间内死亡。 GC大约在每256KB内存分配后发生。经常这样。

将缓存实现为具有最大元素数量的字典可能会更好。然后,您可以使用最近最少使用的算法或基于时间的算法将元素推出集合。通常这种方法比使用弱引用具有更好的性能和内存消耗。

答案 1 :(得分:1)

你不能只使用没有引用的对象,然后在终结器中调用一些代码吗? GC收集对象时会调用终结器。

编辑:当然,你不知道GC什么时候完成..嗯。

答案 2 :(得分:0)

从避免内存泄漏的角度来看,我建议在向字典添加某些内容时,检查已执行的垃圾收集的数量。如果在上次检查字典和最后一次收集的时间之间添加的项目数超过字典大小的合理分数(例如,10%,或某些最小项目数,以较小者为准) ),这将是字典应该被扫描的标志。请注意,此方法将字典中过多项目的数量限制为字典大小的某一部分,同时提供合理的性能,而不管字典大小。