0

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

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

4

1 回答 1

2

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

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

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

于 2010-10-05T20:13:45.180 回答