【问题标题】:Memory leak. ManagementBaseObject stays as GC Root, but never cleaned up内存泄漏。 ManagementBaseObject 保持为 GC Root,但从未清理过
【发布时间】:2011-04-21 10:48:20
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 这与我发现的问题非常接近。见链接social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/…。似乎因为 ManagementBaseObject 不是从程序中创建的,gc 不认为它需要清理。我不得不在所有管理类型类上手动调用 dispose。
    • 呵呵,是我。我记得它,想不出搜索词来找回它。
    猜你喜欢
    • 2021-07-13
    • 1970-01-01
    • 2016-05-31
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多