更新:微软现在已经复制了这个bug并正在修复.
在评估.NET平台的低延迟软件开发的可行性的同时,我们发现了.NET 4并发工作站垃圾收集器中的一个严重错误,它可能导致应用程序一次挂起几分钟.
在我们的三台机器上,以下简单的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();
}
}
Run Code Online (Sandbox Code Playgroud)
您需要在使用.NET 4的64位Windows操作系统上编译x64,并使用默认(交互式)延迟设置运行默认(并发工作站)GC.
以下是在此计算机上运行此程序时任务管理器的外观:

请注意,当此程序需要不超过100Mb的内存时,此处已泄漏了11Gb的堆.
我们现在已经积累了大约十二个这个bug的重复,用F#和C#编写,当大多数gen0存活时,它似乎与GC写入障碍中的一个错误有关.但是,微软还没有能够重现它.你能?如果是这样,您能否尽可能准确地描述您的设置,以便我们可以尝试精确缩小此错误所需的条件.
我想知道如何描述垃圾收集器的性能并监视三代.我想知道是否有可能在任何时间知道当前生活的物体是什么gen0,gen1,gen2.