我正在对用作集成服务的 Windows 服务中的内存泄漏进行故障排除。
每次“doIntegration()”调用我可以看到内存使用率比调用前更高,并且每次调用增加了大约 0.5 MB。
我尝试使用 PerfView 来定位内存泄漏的可能位置。
故障排除方法:
1) 在第一次 doIntegraion 调用之前获取堆快照
2) 在 doIntegration 调用后获取堆快照
3) 多次执行第 2 步
4)检查每次调用哪个方法/组更高
5)使用单独快照上的差异来定位内存泄漏的位置
我可以看到LIB mscorlib!RuntypeType是每次都变高的方法/组。当我尝试检查引用它的内容时,我得到
- 固定手柄
- .NET 根
- 根
- .NET 根
而且我无法进一步扩展树。
当我选择视图时,RefTree 我可以看到更多的东西。
- 根 100%
- .NET 根 100%
- 固定手柄 70.6%
- LIB mscorlib!RuntimeType 46%
- LIB mscorlib!reflection.... 13.4% ...
- 静态变量 30.7%
- ns.ConfigurationSettings 59.5%
- ns.Leaks.ConfigurationSettings -33.3%
- 固定手柄 70.6%
- .NET 根 100%
我对几个快照进行了比较,唯一增加的方法/组是固定句柄,它们只引用 mscorlib 类型。
有没有其他人遇到过这种问题?
我认为问题可能在于使用 XMLSerializer 从模型到 XML 的序列化,但我不太确定。
有谁知道另一种尝试查找内存泄漏的方法?
谢谢 :)