Можете ли вы воспроизвести эту 64-битную ошибку .NET 4 GC? - PullRequest
16 голосов
/ 19 октября 2010

Обновление: 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 по умолчанию (для одновременной рабочей станции) с использованием настройки времени ожидания по умолчанию (интерактивный).

Вот как выглядит диспетчер задач при запуске этой программы на этом компьютере:

alt text

Обратите внимание, что 11 Гб кучи были утечки здесь, когда этой программе требуется не более 100 Мб памяти.

Теперь мы собрали около десятка повторов этой ошибки, написанной на F #, а также на C #, и, похоже, это связано с ошибкой в ​​барьере записи GC, когда выживает большая часть gen0. Однако Microsoft пока не смогла воспроизвести его. Ты можешь? Если да, не могли бы вы описать ваши настройки как можно точнее, чтобы мы могли попытаться точно определить, какие именно условия необходимы для проявления этой ошибки.

Ответы [ 3 ]

3 голосов
/ 21 октября 2010

Я не мог воспроизвести это.Я попробовал это на x64 с 4 гигабайтами оперативной памяти и скомпилирован как ЛЮБОЙ.Максимальное использование памяти было около 2,5 гигабайт.Максимальное время паузы GC было около 1084 мс.

Вот вывод из моей статистики GC ETW.alt text

Вы также можете получать события GC по времени alt text

Вероятно, аналогичный вывод трассировки из вашего прогона может помочь понять, что происходит под прикрытием.

В .NET 4.0 есть трассировка событий для Windows (ETW), которая предоставляет информацию трассировки Framework.Вот что характерно для GC .

И для получения этой информации есть инструмент, который называется PerfView

Ниже приведены инструкции по использованию инструмента для получения информации ГХ

  1. Запустите cmd.exe от имени администратора, это необходимо для сбора трассировки ETW
  2. Запустите приложение, которое вы хотите отследить
  3. Введите команду «PerfMonitor.exe / process: 4180 start»”Где 4180 - идентификатор процесса
  4. Дайте приложению некоторое время поработать
  5. Затем выполните« PerfMonitor.exe stop »
  6. Команда для получения отчета« PerfMonitor.exe »GCTime».Это создаст отчет и откроет его в браузере со статистикой GC.
2 голосов
/ 20 октября 2010

Я писал об этом здесь , и еще шесть человек, кроме меня и Eamon, подтвердили, что они также могут воспроизвести эту ошибку.

Более того, Карстен и Майкл Робин независимо друг от друга повторили мое подозрение, что ошибка проявляется не сразу при каждом запуске, а, скорее, проявляется случайным образом и иногда появляется после многих десятков минут нормальной работы. Другими словами, сборщик мусора .NET по умолчанию является вероятностным и может привести к случайным сбоям, продолжающимся несколько минут.

2 голосов
/ 19 октября 2010

Запуск кода в linqpad действительно приводит к огромному потреблению памяти, если он работает как 64-битный; работает как 32-битный работает нормально.

У меня есть окончательная установка Windows 7 x64 (как обычно, исправлена) с 8 ГБ основной памяти; VS.NET и другие средства разработки установлены, поэтому могут быть некоторые странные отладочные ловушки, которых нет на другом компьютере.

Странно, что они этого не сделали. Вы уверены, что там нет какого-то нарушения связи?

О, и использование «new object ()» вместо типа в штучной упаковке приводит к той же проблеме (что неудивительно), поэтому вы можете захотеть убрать мешающий фактор бокса из вашего репро-случая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...