首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PerfView中检测内存泄漏

在PerfView中检测内存泄漏
EN

Stack Overflow用户
提问于 2015-10-15 11:11:22
回答 1查看 1.1K关注 0票数 3

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

在每个"doIntegration()“调用中,我可以看到内存使用量比调用前更高,并且每次调用增加大约0,5 MB。

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

故障排除方法:

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

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

3)多次执行步骤2

4)检查哪种方法/组在每次调用时得到更高的值

5)使用独立快照上的diff来定位内存泄漏的位置。

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

  • 固定手柄
    • .NET根
      • 根部

我无法再扩展这棵树。

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

  • 根100%
    • .NET根100%
      • 固定手柄70.6%
        • 自由联盟!RuntimeType 46%
        • 自由!倒影..。13.4%

代码语言:javascript
复制
    - Static vars                         30.7%  
        - ns.ConfigurationSettings               59.5%
        - ns.Leaks.ConfigurationSettings        -33.3%

我已经对几个快照做了区分,唯一增量的方法/组是固定句柄,它们只引用mscorlib类型。

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

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

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

谢谢:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-24 09:11:52

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

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

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

现在没有内存泄漏了。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33146974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档