【问题标题】:Periodical WMI Query Causes Memory Leak?定期 WMI 查询导致内存泄漏?
【发布时间】:2011-05-09 17:28:34
【问题描述】:

我对 .NET 编程还很陌生,我目前正在开发一个计算机健康监控系统,该系统现在还处于起步阶段。我将使用 C# 2010 并使用 WMI 查询来查询计算机信息。

在进一步开发应用程序之前,我创建了一个迷你测试应用程序来测试我的类及其方法。测试应用的流程如下:

  1. 应用启动
  2. 输入主机名、用户名和密码
  3. 单击查询按钮并触发查询方法。
  4. 我的 UI 上的文本字段得到更新,打印出查询结果。

我有一个名为 Machine 的类,它包含诸如 CPU 名称之类的属性,以及一些可更新的属性,例如当前 CPU 使用率。在该类中,我有 2 个主要方法,GetStaticSysInfo 和 GetDynamicSysInfo,其中第一个方法查询不随时间变化的系统信息,后一个方法查询 CPU 和内存使用情况等信息。我有另一个名为 Refresh 的方法,我用它来包装 GetDynamicSysInfo 方法。

当我在 UI 中使用 WPF 时,我使用 DispatcherTimer 定期查询机器,并在单击 Query 按钮后将更新的信息打印到 UI 上的文本字段。但是,我注意到每次调用 machine.Refresh() 时,应用程序的内存使用量都会增加一点(几百 KB)。我真的无法弄清楚该程序出了什么问题,如果有人可以就此提供一些建议,我将不胜感激。

如果您需要更多信息或代码的任何部分,请告诉我。

提前致谢。

编辑:我在 Timer_Tick 方法上添加了 GC.Collect(),看起来内存使用量仍在攀升,但每隔几个计时器滴答声就会降低一次。它仍在增加,但速度较慢。这是正确的做法吗?从长远来看会影响性能吗?

【问题讨论】:

  • 我还看到 WMI 产生越来越多的内存负载 - 令人抓狂的是它是间歇性的。基于 Visual Studio 应用分析器,它似乎来自Select * from Win32_PnPEntity 的结果——结果似乎在后续调用中不断增长。有趣的是,这只会在我使用特定的 USB 设备时发生。然后,只是偶尔会发生一次。

标签: c# wmi


【解决方案1】:

除非出于诊断目的,否则您永远不应致电GC.Collect()。运行时对于 GC 应该运行的时间有更好的算法。此外,过于频繁地调用 Collect() 可能会导致对象被提升到第 1 代或第 2 代,这实际上意味着它们在不再使用后被收集得更慢,即增加内存占用。

如果手动收集后内存再次下降(回到之前的值),那么您没有内存泄漏。由于 GC 并非一直运行,因此您将在 GC 运行之间增加内存。这不必担心。

【讨论】:

  • 嗨丹尼尔,谢谢你的解释。我已经注释掉了手动 GC,看起来进程的内存使用率确实下降了,但是速度较慢(一两分钟),这应该是你提到的那样。非常感谢:D
  • 只要没有内存压力,GC就没有真正的理由运行。所以在这种情况下,它只会每隔一段时间运行一次。
猜你喜欢
  • 2015-10-18
  • 2019-08-26
  • 1970-01-01
  • 2015-07-06
  • 2014-06-07
  • 2013-11-20
  • 2011-10-28
  • 2016-01-18
  • 2012-12-13
相关资源
最近更新 更多