使用PerfView检测内存泄漏

时间:2015-10-15 11:11:23

标签: .net memory-leaks mscorlib perfview

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

Per" doIntegration()"打电话我可以看到内存使用率比呼叫前高,并且每次呼叫上升大约0.5 MB。

我尝试使用PerfView来查找内存泄漏的位置。

故障排除方法:

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

2)在doIntegration调用

之后获取堆快照

3)多次执行第2步

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

5)在单独的快照上使用diff来查找内存泄漏的位置

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

  • 固定手柄
    • .NET Root
      • ROOT

我无法更多地扩展树。

当我选择视图时,RefTree我会看到更多的东西。

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

我在几个快照上做了一个diff,唯一增加的方法/组是Pinned句柄,它们只引用mscorlib类型。

还有其他人遇到过这种问题吗?

我认为问题可能在于使用XMLSerializer从Model到XML的序列化,但我并不确定。

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

谢谢:)

1 个答案:

答案 0 :(得分:3)

答案很晚。但我认为正是串行器增加了每个“doWork”的内存使用量。

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

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

现在没有内存泄漏。