首页 > 解决方案 > 内存消耗什么?

问题描述

我试图弄清楚每次迭代究竟增加了内存消耗:

ManagementObjectSearcher Win32_Process = new ManagementObjectSearcher("Select * From Win32_Process");

while (true)
{
    foreach (ManagementObject PS in Win32_Process.Get()) { }

    //Not using the garbage collector GC.Collect()

    Thread.Sleep(1000);
}

查看已用内存的图表:

在此处输入图像描述 在此处输入图像描述

我确信自动垃圾收集器在循环后清除了内存。为什么这没有发生?如何在不使用的情况下避免内存扩展GC.Collect()?谢谢

标签: c#garbage-collection

解决方案


确信自动垃圾收集器在循环后清除了内存。

为什么?说明书说反了。

为什么这没有发生?

因为没有必要。GC 在需要时运行,而不是在每个循环之后(不管是什么)。

如何在不使用 GC.Collect() 的情况下避免内存扩展?

你不。或者,你这样做 - 以一种在长期内留下尽可能少的垃圾的方式进行编程。

在您的特定情况下,它也有助于不要忽略这是一个 IDisposable 对象并且您不处置它。所有 COM 对象都是 IDisposable。如果不处理它,您很有可能会丢失 GC 看不到的内存,因此它不会触发 GC。


推荐阅读