我应该在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从不自动调用垃圾回收器,dispose设计释放非托管资源。垃圾回收器的执行是经过调度的进程,这些进程将在指定时间后运行。
当您调用.Net Garbage Collector时,它会在垃圾回收上调用对象的Object.Finilize方法来释放管理资源,这就是为什么您的内存使用计数显示较少的数