Обновление: Microsoft теперь воспроизвела ошибку и работает над исправлением.
Оценивая жизнеспособность платформы .NET для разработки программного обеспечения с малой задержкой, мы обнаружили серьезную ошибку в сборщике мусора .NET 4, который может зависеть от приложений в течение нескольких минут за раз.
На трех наших машинах следующая простая программа С# заставляет 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();
}
}
Вам нужно скомпилировать для x64 в 64-разрядной ОС Windows с .NET 4 и запустить с GC (по умолчанию) (с одновременной рабочей станцией), используя настройку по умолчанию (интерактивная).
Вот как выглядит диспетчер задач при запуске этой программы на этом компьютере:
Обратите внимание, что здесь утечка 11 Гб кучи, когда для этой программы требуется не более 100 Мб памяти.
Теперь мы собрали около десятка рецензий этой ошибки, написанных на F #, а также на С#, и, похоже, она связана с ошибкой в барьете записи GC, когда большинство из gen0 выживает. Однако Microsoft пока не смогла воспроизвести его. Ты можешь? Если да, можете ли вы описать свою установку как можно точнее, поэтому мы можем попытаться сузить точно, какие условия необходимы для проявления этой ошибки.