更新:微软已经重现了这个bug,并正在修复中。
在评估.NET平台用于低延迟软件开发的可行性时,我们发现了一个严重的问题,即.NET 4并发工作站垃圾收集器中存在一个bug,可能会导致应用程序暂停数分钟。
在我们的三台计算机上,以下简单的C#程序会导致GC泄漏内存,直到没有剩余内存,然后启动一次大型GC周期,导致程序暂停数分钟,同时回收11GB堆内存:
static void Main(string[] args)
{
var q = new System.Collections.Generic.Queue<System.Object>();
while (true)
{
q.Enqueue(0);
if (q.Count > 1000000)
q.Dequeue();
}
}
在64位Windows操作系统上,您需要使用.NET 4编译为x64,并使用默认(并发工作站)GC以及默认的(交互式)延迟设置来运行。
以下是在此计算机上运行此程序时任务管理器的截图:
请注意,在这里泄漏了11GB的堆内存,而这个程序所需的内存不超过100MB。
我们现在已经积累了大约十几个F#和C#的可复现此错误的示例,看起来它与GC写入屏障中的一个错误有关,当大多数gen0幸存时就会出现。 然而,微软尚未能够再现此问题。您能吗?如果可以,请尽可能准确地描述您的设置,以便我们可以尝试缩小确切需要出现此错误的条件范围。