gpt4 book ai didi

.net - 使用 PerfView 检测内存泄漏

转载 作者:行者123 更新时间:2023-12-04 02:17:17 33 4
gpt4 key购买 nike

我正在对用作集成服务的 Windows 服务中的内存泄漏进行故障排除。

每次“doIntegration()”调用我都可以看到内存使用率比调用前更高,并且每次调用增加了大约 0.5 MB。

我已经尝试使用 PerfView 来定位可能存在内存泄漏的位置。

故障排除方法:

1) 在第一次调用 doIntegraion 之前获取堆快照

2) 在调用 doIntegration 后获取堆快照

3) 多次执行步骤2

4) 检查哪个方法/组在每次调用时变得更高

5) 使用单独快照上的差异来定位内存泄漏的位置

我可以看到 LIB mscorlib!RuntypeType 是每次都变得更高的方法/组。当我尝试检查它指的是什么时,我得到了

  • 固定 handle
    • .NET根目录
      • 根目录

而且我无法进一步扩展树。

当我选择 View 时,RefTree 我会看到更多东西。

  • 根 100%
    • .NET 根 100%
      • 固定 handle 70.6%
        • LIB mscorlib!RuntimeType 46%
        • LIB mscorlib!反射.... 13.4%...
      • 静态变量 30.7%
        • ns.ConfigurationSettings 5​​9.5%
        • ns.Leaks.ConfigurationSettings -33.3%

我对几个快照进行了比较,唯一递增的方法/组是固定句柄,它们只引用 mscorlib 类型。

有没有人遇到过这种问题?

我认为问题可能出在使用 XMLSerializer 从模型到 XML 的序列化中,但我不太确定。

有谁知道另一种尝试查找内存泄漏的方法?

谢谢 :)

最佳答案

答案来得太晚了。但我的假设是正确的,即序列化程序增加了每个“doWork”的内存使用量。

XmlSerializer 有一些“讨厌的”构造函数,它们实际上会在每次初始化时创建一个临时程序集,并且它们不会被 GC 收集。

我缓存了不同的 XmlSerializer,这些 XmlSerializer 使用了一个讨厌的构造函数,因此临时程序集只创建一次。

现在没有内存泄漏了。

关于.net - 使用 PerfView 检测内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33146974/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com