我在使用 WCF Web 服务时遇到了一些问题(一些转储、内存泄漏等),我运行了一个 profillng 工具(ANTS 内存配置文件)。
只是为了发现即使处理结束(我运行特定测试然后停止),第 2 代也是 Web 服务内存的 25%。我追踪了这段内存,发现我有一个字典对象,里面满是 (null, null) 项,哈希码为 -1。
Web 服务的工作流意味着在特定的处理过程中添加项目,然后从字典中删除(只是简单的Add
and Remove
)。没有大碍。但似乎在删除所有项目后,字典中充满了 (null, null) KeyValuePair
。实际上有数千个,这样它们占用了很大一部分内存并最终发生溢出,相应的强制应用程序池回收和 DW20.exe 获得了它可以获得的所有 CPU 周期。
字典实际上是Dictionary<SomeKeyType, IEnumerable<KeyValuePair<SomeOtherKeyType, SomeCustomType>>>
(System.OutOfMemoryException 因为大字典)所以我已经检查了是否有某种引用保存的东西。
字典包含在一个静态对象中(以使其可以通过处理访问不同的处理线程),所以从这个问题以及更多(静态成员是否得到垃圾收集?)我理解为什么该字典在第 2 代。但这是还有那些(null,null)的原因?即使我从字典中删除项目,内存中总是会占用一些东西?
这不是一个速度问题,就像这个问题Deallocate memory from large data structures in C#。似乎记忆永远不会被回收。
我可以做些什么来实际从字典中删除项目,而不仅仅是继续用 (null, null) 对填充它?还有什么我需要检查的吗?