如何解决当不再使用非全局ConcurrentDictionary时,我应该明确清除它,还是GC检测到不再使用它?
我应该在不再使用非全局ConcurrentDictionary时明确地清除它,还是GC检测到它不再使用了?
这与以下内容有关:Is ConcurrentBag cause of memory leak?
编辑: 我问的原因是,我有以下类型的代码(在此处简化):
let myMethod() =
async {
let myEventList = ConcurrentDictionary<myEventParams,bool>()
use o = myEvent |> Observable.subscribe(fun e ->
myEventList.GetOrAdd(e,true) |> ignore)
let! res = doAsyncThingsCausingEvents()
myEventList |> Seq.iter(fun (e,_) -> Console.WriteLine "We had " + e.ToString())
res
}
...实际上,当在多个线程中多次并行调用时,它会泄漏内存。
解决方法
有趣的问题。 ConcurrentDictionary
不是IDisposable
,所以我希望它像其他任何对象一样工作。即,当不再引用它时,它就有资格进行收集,包括没有其他引用的所有自有物品。
通过分配ConcurrentDictionary,使引用为空并捕获内存快照进行快速测试表明确实如此。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。