【问题标题】:Detect memory leaks usin PerfView使用 PerfView 检测内存泄漏
【发布时间】:2015-10-15 11:11:22
【问题描述】:

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

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

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

故障排除方法:

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

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

3) 多次执行第 2 步

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

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

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

  • 固定手柄
    • .NET 根目录

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

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

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

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

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

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

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

谢谢:)

【问题讨论】:

  • 查看创建这些对象的堆栈跟踪,可能会提示您这些对象是什么。
  • 谢谢!我试图追踪它,并且我认为它是由于序列化程序造成的。序列化程序使用创建临时程序集的构造函数打开,显然该程序集不在 GC 管辖范围内。因此,每次调用 dointegration 时,都会创建几个临时程序集。

标签: .net memory-leaks mscorlib perfview


【解决方案1】:

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

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

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

现在没有内存泄漏了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    相关资源
    最近更新 更多