你能否重现这个64位.NET 4 GC错误?

Jon*_*rop 16 .net garbage-collection

更新:微软现在已经复制了这个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写入障碍中的一个错误有关.但是,微软还没有能够重现它.你能?如果是这样,您能否尽可能准确地描述您的设置,以便我们可以尝试精确缩小此错误所需的条件.

Eam*_*nne 2

如果以 64 位运行,在 linqpad 中运行代码确实会导致巨大的内存消耗;作为 32 位运行可以正常工作。

我有一个 Windows 7 x64 终极安装(照常修补),主内存为 8GB;安装了 VS.NET 和其他开发工具,因此可能会有一些奇怪的调试器挂钩,这些挂钩在其他空白计算机上不存在。

奇怪的是他们没有复制它。你确定那里没有通讯故障吗?

哦,使用“new object()”而不是装箱值类型会导致相同的问题(毫不奇怪),因此您可能希望从重现案例中删除装箱的混杂因素。