我应该在Dispose()方法中调用GC.Collect()吗

本文关键字:GC Collect 调用 方法 Dispose 我应该 | 更新日期: 2023-09-27 18:24:41

我的示例代码:

using System;
namespace Program
{
    class Test : IDisposable
    {
        public long Loop()
        {
            for (int i = 0; i < 10000; i++)
            {
                var t = new Test();
            }
            return GC.GetTotalMemory(false);
        }
        public void Dispose()
        {
            GC.Collect();
        }
    }
    class MainClass
    {
        static void Main()
        {
            Console.WriteLine("Memory used: " + GC.GetTotalMemory(false));
            using (var t = new Test())
            {
                long size = t.Loop();
                Console.WriteLine("Memory used: " + size);
            }
            //object "t" and variable "size" cannot be re-used here
            //GC.Collect() should be called automatically
            Console.WriteLine("Memory used: " + GC.GetTotalMemory(false));
        }
    }
}

结果是:

使用的内存:29868

使用的内存:160940

使用的内存:30712

如果我在Dispose方法中去掉GC.Collect(),结果可能是:

使用的内存:29868

使用的内存:160940

使用的内存:160940

我不明白为什么我运行using语句后GC.Collect()不自动启动?

你能给我一个理由吗?

还有一个子问题:如果我想在Dispose方法中调用GC.Collect(),有必要吗?

我应该在Dispose()方法中调用GC.Collect()吗

dispose从不自动调用垃圾回收器,dispose设计释放非托管资源。垃圾回收器的执行是经过调度的进程,这些进程将在指定时间后运行。

当您调用.Net Garbage Collector时,它会在垃圾回收上调用对象的Object.Finilize方法来释放管理资源,这就是为什么您的内存使用计数显示较少的数