c# - 如何有效地读取我的 C# 服务的 Visual Studio 2019 内存快照?
问题描述
当我询问内存快照时,我已经阅读了出现的其他问题,但我可能太厚而无法真正掌握它。我有一个 Windows 服务,我可以通过重复执行非常简单的数据操作来产生内存泄漏。我一路上拍摄了内存快照,我看到根的数量正在增加(从成功启动后的 2,100 到 100 次左右的数据操作后的 7,100)。快照是在蓝色箭头标记处拍摄的:
在多次数据操作之前,内存快照是这样的:
之后,它看起来像这样:
我们使用 WCF 进行数据传输,看起来序列化在内存增长中发挥了作用,但我不知道从哪里开始。如果我查看 的实例RuntimeType+RuntimeTypeCache
,绝大多数实例如下所示:
如果有人可以帮助我弄清楚下一步要采取的措施,我将不胜感激。我们有一个静态实例,它有一个ServiceHosts
我怀疑的并发字典,但我不知道如何确认它。
编辑:
这似乎也很重要,并且是指ServiceHosts
. 我们能否通过这种静态关系启用一些不明智的代理生成和实例保留?
解决方案
按大小对您的项目进行排序,并在该列表中注意您自己的班级类型。哪一个在堆积。至少总共有几兆字节的对象,以确保看到一个真正的“堆”,而不仅仅是基础设施的某些部分。
现有的 12.000 个运行时类型,可能表示动态创建的类型,可能会为每个新调用创建序列化 DLL。
您也可以在关键函数调用之后尝试执行 GC.Collect() 来强制垃圾收集。
推荐阅读
- c# - 如何强制向 IEquatable 的 Equals 方法添加新的公共属性
班级 - git - 如何取消暂存所有已暂存以进行提交的文件?
- next.js - Next Js 中的 Bootstrap 无法解决
- visual-studio-2013 - 有条件的如果没有按预期返回
- c++ - 是否可以人为触发 ReadDirectoryChangesW?
- javascript - 减少大数组JS中的对象中的数组
- javascript - 如何在 Javascript 中使用正则表达式在不指定固定长度的情况下截断部分 url?
- flutter - 如何使用 NestedScrollView 实现这一点?
- sbt - 使用 IntelIJ 和 SBT 构建 scala 项目时出错
- python-3.x - 如何在 pandas 中生成更快的滑动窗口功能?