我正在对用作集成服务的Windows服务中的内存泄漏进行故障排除。
Per" doIntegration()"打电话我可以看到内存使用率比呼叫前高,并且每次呼叫上升大约0.5 MB。
我尝试使用PerfView来查找内存泄漏的位置。
故障排除方法:
1)在第一次doIntegraion调用之前获取堆快照
2)在doIntegration调用
之后获取堆快照3)多次执行第2步
4)检查每次调用哪个方法/组获得更高
5)在单独的快照上使用diff来查找内存泄漏的位置
我可以看到 LIB mscorlib!RuntypeType 是每次都变得更高的方法/组。当我试图检查它的内容时,我得到了
我无法更多地扩展树。
当我选择视图时,RefTree我会看到更多的东西。
我在几个快照上做了一个diff,唯一增加的方法/组是Pinned句柄,它们只引用mscorlib类型。
还有其他人遇到过这种问题吗?
我认为问题可能在于使用XMLSerializer从Model到XML的序列化,但我并不确定。
有没有人知道另一种尝试查找内存泄漏的方法?
谢谢:)
答案 0 :(得分:3)
答案很晚。但我认为正是串行器增加了每个“doWork”的内存使用量。
XmlSerializer有一些“令人讨厌的”构造函数,它们实际上会为每个init创建一个临时程序集,并且它们不会被GC收集。
我缓存了使用其中一个讨厌构造函数的不同XmlSerializer,这样只能创建一次临时程序集。
现在没有内存泄漏。