首页 > 解决方案 > 如何有效地读取我的 C# 服务的 Visual Studio 2019 内存快照?

问题描述

当我询问内存快照时,我已经阅读了出现的其他问题,但我可能太厚而无法真正掌握它。我有一个 Windows 服务,我可以通过重复执行非常简单的数据操作来产生内存泄漏。我一路上拍摄了内存快照,我看到根的数量正在增加(从成功启动后的 2,100 到 100 次左右的数据操作后的 7,100)。快照是在蓝色箭头标记处拍摄的:

在此处输入图像描述

在多次数据操作之前,内存快照是这样的:

在此处输入图像描述

之后,它看起来像这样:

在此处输入图像描述

我们使用 WCF 进行数据传输,看起来序列化在内存增长中发挥了作用,但我不知道从哪里开始。如果我查看 的实例RuntimeType+RuntimeTypeCache,绝大多数实例如下所示:

在此处输入图像描述

如果有人可以帮助我弄清楚下一步要采取的措施,我将不胜感激。我们有一个静态实例,它有一个ServiceHosts我怀疑的并发字典,但我不知道如何确认它。

编辑:

这似乎也很重要,并且是指ServiceHosts. 我们能否通过这种静态关系启用一些不明智的代理生成和实例保留?

在此处输入图像描述

标签: c#memory-managementmemory-leaks

解决方案


按大小对您的项目进行排序,并在该列表中注意您自己的班级类型。哪一个在堆积。至少总共有几兆字节的对象,以确保看到一个真正的“堆”,而不仅仅是基础设施的某些部分。

现有的 12.000 个运行时类型,可能表示动态创建的类型,可能会为每个新调用创建序列化 DLL。

您也可以在关键函数调用之后尝试执行 GC.Collect() 来强制垃圾收集。


推荐阅读