使用 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。当我尝试检查它指的是什么时,我得到
- 固定手柄
- .NET根目录
- 根目录
而且我无法进一步扩展树。
当我选择视图时,RefTree 会看到更多内容。
- ROOT 100%
- .NET ROOT 100%
- 固定手柄 70.6%
- LIB mscorlib!RuntimeType 46%
- LIB mscorlib!反射.... 13.4%
...
- 静态变量 30.7%
- ns.ConfigurationSettings 59.5%
- ns.Leaks.ConfigurationSettings-33.3%
我已经对几个快照进行了比较,唯一增加的 method/group 是固定句柄,它们只引用 mscorlib 类型。
有没有其他人遇到过这种问题?
我认为问题可能出在使用 XMLSerializer 从模型到 XML 的序列化中,但我不太确定。
有谁知道另一种尝试查找内存泄漏的方法吗?
谢谢 :)
答案来得太晚了。但我的假设是正确的,即序列化程序增加了每个 "doWork".
的内存使用量
XmlSerializer 有一些 "nasty" 构造函数,它们实际上会在每次初始化时创建一个临时程序集,并且它们不会被 GC 收集。
我缓存了不同的 XmlSerializer,它们使用了一个讨厌的构造函数,这样临时程序集只创建一次。
现在没有内存泄漏了。
我正在对用作集成服务的 windows 服务中的内存泄漏进行故障排除。
每次 "doIntegration()" 调用我可以看到内存使用率比调用之前更高,并且每次调用增加大约 0.5 MB。
我已经尝试使用 PerfView 来定位可能存在内存泄漏的位置。
故障排除方法:
1) 在第一次调用 doIntegraion 之前获取堆快照
2) 在 doIntegration 调用后获取堆快照
3) 多次执行步骤 2
4) 检查每次调用 Method/Group 提高的是什么
5) 在单独的快照上使用差异来定位内存泄漏的位置
我可以看到 LIB mscorlib!RuntypeType 是每次都变高的 method/group。当我尝试检查它指的是什么时,我得到
- 固定手柄
- .NET根目录
- 根目录
- .NET根目录
而且我无法进一步扩展树。
当我选择视图时,RefTree 会看到更多内容。
- ROOT 100%
- .NET ROOT 100%
- 固定手柄 70.6%
- LIB mscorlib!RuntimeType 46%
- LIB mscorlib!反射.... 13.4% ...
- 静态变量 30.7%
- ns.ConfigurationSettings 59.5%
- ns.Leaks.ConfigurationSettings-33.3%
- 固定手柄 70.6%
- .NET ROOT 100%
我已经对几个快照进行了比较,唯一增加的 method/group 是固定句柄,它们只引用 mscorlib 类型。
有没有其他人遇到过这种问题?
我认为问题可能出在使用 XMLSerializer 从模型到 XML 的序列化中,但我不太确定。
有谁知道另一种尝试查找内存泄漏的方法吗?
谢谢 :)
答案来得太晚了。但我的假设是正确的,即序列化程序增加了每个 "doWork".
的内存使用量XmlSerializer 有一些 "nasty" 构造函数,它们实际上会在每次初始化时创建一个临时程序集,并且它们不会被 GC 收集。
我缓存了不同的 XmlSerializer,它们使用了一个讨厌的构造函数,这样临时程序集只创建一次。
现在没有内存泄漏了。