内存泄漏。 ManagementBaseObject保留为GC Root,但从未清理过

时间:2010-10-05 18:00:13

标签: c# .net memory-leaks red-gate-ants

我正在使用ANTS Memory Profiler来尝试确定我的应用程序的内存使用量持续增长的原因。

我运行应用程序并随着时间的推移拍摄各种快照。我可以看到IWbemClassObjectFreeThreaded和ManagementBaseObject的实时实例随着时间的推移不断增加。查看类引用资源管理器,我可以看到ManagementBaseObject引用了IWbemClassObjectFreeThreaded,并且100%的ManagementBaseObjects是GC根,但它们似乎从未被清理过。我还能什么时候做?

1 个答案:

答案 0 :(得分:2)

这是一个不寻常的问题,但它可能会发生。 WMI是基于COM的,IWbemClassObject是一个获取RCW包装器的COM接口。在终结器线程运行之前,这些包装器不会被清理。从技术上讲,可以运行大量WMI查询但不能对结果进行足够的工作以使垃圾收集器运行。

使用Perfmon.exe,性能监视器进行诊断。右键单击图形,添加计数器,.NET CLR内存并添加#Gen 0 Collections计数器。从底部列表中选择您的程序。在程序运行时观察计数器。如果没有问题,你会遇到这个问题。

如果是这种情况,请检查您的代码并验证运行这么多查询是否仍然有意义,但从不或很少使用结果。一种解决方法是对它们进行计数,然后每次调用100,000次,调用GC.Collect()和GC.WaitForPendingFinalizers()。