C# 内存消耗什么?

C# 内存消耗什么?,c#,garbage-collection,C#,Garbage Collection,我试图找出每次迭代都会增加内存消耗的确切原因: ManagementObjectSearcher Win32_Process = new ManagementObjectSearcher("Select * From Win32_Process"); while (true) { foreach (ManagementObject PS in Win32_Process.Get()) { } //Not using the garbage collector GC.Colle

我试图找出每次迭代都会增加内存消耗的确切原因:

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()的情况下扩展内存?谢谢

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

为什么??手册上写的正好相反

为什么没有发生这种情况

因为没有必要。GC在需要的时候运行,而不是在每个周期之后(不管这是什么)

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

你没有。或者,你可以用一种在较长时间内尽可能少地留下垃圾的方式进行编程

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

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

为什么??手册上写的正好相反

为什么没有发生这种情况

因为没有必要。GC在需要的时候运行,而不是在每个周期之后(不管这是什么)

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

你没有。或者,你可以用一种在较长时间内尽可能少地留下垃圾的方式进行编程


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

它是否会永远增加?垃圾收集会根据需要进行,而不是在确定的点上进行,如退出作用域。垃圾收集器会在需要时以及释放对对象的引用时收集垃圾。由于您处于
while(true)
循环中,并且似乎没有任何中断,因此GC似乎至少没有理由收集
Win32_进程
。垃圾收集器被调用到不再使用的对象,看起来您正在调用
ManagementObject.Get()
这意味着该对象正在使用。这是否回答了您的问题?还是它一直在增加?垃圾收集是根据需要进行的,而不是在确定的点上进行的,比如退出作用域。垃圾收集器将在需要时以及释放对对象的引用时收集垃圾。由于您处于
while(true)
循环中,并且似乎没有任何中断,因此GC似乎至少没有理由收集
Win32_进程
。垃圾收集器被调用到不再使用的对象,看起来您正在调用
ManagementObject.Get()
这意味着该对象正在使用。这是否回答了您的问题?或