使用 PerfView 检测内存泄漏

Detect memory leaks usin PerfView

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

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

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

故障排除方法:

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

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

3) 多次执行步骤 2

4) 检查每次调用 Method/Group 提高的是什么

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

我可以看到 LIB mscorlib!RuntypeType 是每次都变高的 method/group。当我尝试检查它指的是什么时,我得到

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

当我选择视图时,RefTree 会看到更多内容。

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

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

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

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

谢谢 :)

答案来得太晚了。但我的假设是正确的,即序列化程序增加了每个 "doWork".

的内存使用量

XmlSerializer 有一些 "nasty" 构造函数,它们实际上会在每次初始化时创建一个临时程序集,并且它们不会被 GC 收集。

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

现在没有内存泄漏了。