内存泄漏。 ManagementBaseObject住宿为GC根,但从来没有清理
-
28-09-2019 - |
题
我使用蚂蚁内存分析器,试图确定为什么我的应用程序的内存使用量继续增长。
我运行应用程序并采用各种快照随时间。我可以看到IWbemClassObjectFreeThreaded和ManagementBaseObject的现场情况不断随着时间的推移不断增加。纵观类引用探险家,我可以看到IWbemClassObjectFreeThreaded由ManagementBaseObject参考,并ManagementBaseObjects的100%的GC根,但他们似乎从来没有被清理。什么时候我还能做什么?
解决方案
这是一个不寻常的问题,但它可能发生。 WMI是基于COM的IWbemClassObject是一个COM接口,得到一个RCW包装。这些包装没有得到清理,直到终结线程运行。这在技术上是可以运行大量的WMI查询,但没有做足够的工作,结果得到的垃圾收集器运行。
用的Perfmon.exe,性能监视器诊断此。右键单击图表,添加计数器,.NET CLR内存,并添加#第0集计数器。请从下方列表中的程序。你的程序运行时观察计数器。如果没有微涨你也会有这样的问题。
如果是这种情况,检查代码,并验证它是否仍然有意义的运行,因此许多查询,但从来没有或很少使用的结果。一种解决方法是计算它们与每一个,比方说,10万次调用GC.Collect()和GC.WaitForPendingFinalizers()。
不隶属于 StackOverflow