代码之家  ›  专栏  ›  技术社区  ›  Tuomas Hietanen

我应该在不再使用时明确清除非全局ConcurrentDictionary,还是GC检测到它不再使用?

  •  0
  • Tuomas Hietanen  · 技术社区  · 4 年前

    我应该在不再使用时明确清除非全局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
      }
    

    ...事实上,当在多个线程中多次并行调用时,它会泄漏内存。

    0 回复  |  直到 4 年前
        1
  •  2
  •   JonasH    4 年前

    有趣的问题。这个 ConcurrentDictionary 不是 IDisposable ,所以我希望它能像其他物体一样工作。i、 e.不再引用时,应符合收集条件,包括没有其他引用的所有物品。

    通过分配ConcurrentDictionary、清空引用和捕获内存快照进行快速测试表明,情况确实如此。