结果发现即使处理已经结束(我运行了一个特定的测试然后停止了),第二代内存仍占Web服务内存的25%。我追踪这个内存,发现我有一个字典对象,其中包含(null,null)项,哈希码为-1。
Web服务的工作流程意味着在特定的处理过程中添加和删除项目到字典中(只是简单的Add
和Remove
)。这不是什么大问题。但似乎在所有项目被删除后,字典中仍充满了(null,null)KeyValuePair
。实际上有成千上万个,它们占据了大量内存,最终会导致溢出,强制应用程序池回收并使DW20.exe获取所有可获取的CPU周期。
实际上,该字典是 Dictionary<SomeKeyType, IEnumerable<KeyValuePair<SomeOtherKeyType, SomeCustomType>>>
(由于大字典导致System.OutOfMemoryException),因此我已经检查是否有某种引用来保存内容。
该字典包含在静态对象中(以便通过处理使其可访问不同的处理线程),因此根据这个问题和更多问题(静态成员会被垃圾回收吗?),我理解为什么该字典在第2代。但这也是那些(null,null)的原因吗?即使我从字典中删除项目,某些东西也将一直占用内存吗?
这不像这个问题中的速度问题 从C#中的大数据结构中释放内存。似乎内存永远不会被回收。
我能做些什么来真正从字典中删除项,而不仅仅是用(null,null)对填充它?还有其他需要检查的吗?
List<>
有一个TrimExcess()
方法,Dictionary<,>
不幸地没有。我以为这很容易得分 :) - C.EvenhuisList
的TrimExcess()
来换取Dictionary
的性能,但这本来是个好主意。尽管其他人似乎对此感兴趣:https://dev59.com/dnI-5IYBdhLWcg3w483k - Coral DoeClear()
并检查操作是否真的发生,但它并没有改变所描述的行为。 - Coral Doe