在.net中删除集合中的弱引用的最佳时机

本文关键字:时机 引用 最佳 集合 net 删除 | 更新日期: 2023-09-27 17:52:50

我有一个集合(我正在编写一个弱字典),我需要定期剔除失效的弱引用。我通常看到的是Add和Remove方法中的检查:"在对集合进行X次修改之后,是时候进行剔除了。"这对我来说是可以接受的,但似乎应该有更好的方法。

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

或者我忽略了另一种方法。

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

在.net中删除集合中的弱引用的最佳时机

我猜你是想创建一个弱字典作为一些数据的"惰性"缓存方式。

您需要考虑这样一个事实,即GC将经常发生,并且如果没有其他对象引用您的弱引用,那么大多数时候它们将失效。GC大约在每分配256KB内存之后发生。这是很常见的。

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

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

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

从避免内存泄漏的角度出发,我建议在向字典中添加内容时,检查是否执行了垃圾收集的次数。如果在最后一次检查字典和最后一次收集发生的时间之间添加的项数超过了字典大小的合理部分(例如,10%,或某个最小项数,以较少者为例),则表明应该对字典进行扫描。请注意,这种方法将把字典中过多项的数量限制在字典大小的一定比例内,同时无论字典大小如何都能提供合理的性能。