让我们想象一下这个简单的测试程序:
static void Main(string[] args)
{
var length = 30000000;
var c = new List<object>();
for (int i = 0; i < length; i++)
{
c.Add(new object());
}
var start = DateTime.Now;
GC.Collect();
GC.WaitForFullGCComplete();
Console.WriteLine("GC took " + (DateTime.Now - start).TotalMilliseconds + " ms");
Console.ReadKey();
}
在我的计算机(Framework 4.0,x64)上,输出约为 1.4 秒,而样本消耗了 ~1GB 的 RAM。
问题:有什么方法可以加速垃圾收集?有什么最佳做法吗?客户端应用程序中约 1GB 的内存消耗很多,但仍然相当合理。但是在我的情况下,延迟超过 1 秒是不可接受的。
只是可能不会得到支持但可以帮助我的想法:
- 我可以告诉 GC 忽略某些对象吗?
- 我可以将堆分成多个部分,以便让 GC 在部分堆上运行。(我宁愿十倍 100 毫秒的延迟。)