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