代码之家  ›  专栏  ›  技术社区  ›  Jeremy

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

  •  0
  • Jeremy  · 技术社区  · 15 年前

    我正在使用ANTS内存分析器来尝试确定为什么我的应用程序的内存使用在继续增长。

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

    1 回复  |  直到 15 年前
        1
  •  2
  •   Hans Passant    15 年前

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

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

    如果是这种情况,请检查代码并验证运行这么多查询(但从不使用或很少使用结果)是否仍然有意义。解决办法是数一数,每打10万次电话GC.收集(二)和等待终结器().