我使用蚂蚁内存分析器,试图确定为什么我的应用程序的内存使用量继续增长。

我运行应用程序并采用各种快照随时间。我可以看到IWbemClassObjectFreeThreaded和ManagementBaseObject的现场情况不断随着时间的推移不断增加。纵观类引用探险家,我可以看到IWbemClassObjectFreeThreaded由ManagementBaseObject参考,并ManagementBaseObjects的100%的GC根,但他们似乎从来没有被清理。什么时候我还能做什么?

有帮助吗?

解决方案

这是一个不寻常的问题,但它可能发生。 WMI是基于COM的IWbemClassObject是一个COM接口,得到一个RCW包装。这些包装没有得到清理,直到终结线程运行。这在技术上是可以运行大量的WMI查询,但没有做足够的工作,结果得到的垃圾收集器运行。

用的Perfmon.exe,性能监视器诊断此。右键单击图表,添加计数器,.NET CLR内存,并添加#第0集计数器。请从下方列表中的程序。你的程序运行时观察计数器。如果没有微涨你也会有这样的问题。

如果是这种情况,检查代码,并验证它是否仍然有意义的运行,因此许多查询,但从来没有或很少使用的结果。一种解决方法是计算它们与每一个,比方说,10万次调用GC.Collect()和GC.WaitForPendingFinalizers()。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top