我正在对用作集成服务的windows服务中的内存泄漏进行故障排除。
在每个"doIntegration()“调用中,我可以看到内存使用量比调用前更高,并且每次调用增加大约0,5 MB。
我已经尝试使用PerfView来定位内存泄漏的位置。
故障排除方法:
1)在第一次doIntegraion调用之前获取堆快照
2)在doIntegration调用后获取堆快照
3)多次执行步骤2
4)检查哪种方法/组在每次调用时得到更高的值
5)使用独立快照上的diff来定位内存泄漏的位置。
我可以看到,LIB mscorlib!RuntypeType是每次都会更高的方法/组。当我试着检查指的是什么时,我得到
我无法再扩展这棵树。
当我选择视图时,RefTree会看到更多的东西。
- Static vars 30.7%
- ns.ConfigurationSettings 59.5%
- ns.Leaks.ConfigurationSettings -33.3%
我已经对几个快照做了区分,唯一增量的方法/组是固定句柄,它们只引用mscorlib类型。
还有其他人遇到过这种问题吗?
我认为问题可能是使用XMLSerializer从模型序列化到XML,但我不太确定。
有没有人知道另一种方法来尝试找出内存泄漏?
谢谢:)
发布于 2015-11-24 09:11:52
答案来得太晚了。但我的假设是,是序列化器增加了每个"doWork“的内存使用量。
XmlSerializer有一些“令人讨厌的”构造函数,它们实际上会为每个init创建一个临时程序集,并且它们不会被GC收集。
我缓存了使用一个讨厌的构造函数的不同的XmlSerializers,这样临时程序集只能被创建一次。
现在没有内存泄漏了。
https://stackoverflow.com/questions/33146974
复制相似问题