Подтвердить что ты не робот

Почему одновременный GC иногда вызывает ExecutionEngineException (для MSDN)?

Согласно MSDN, есть "подсказка" о том, что приложение .NET работает под большой нагрузкой с одновременной сборкой мусора (либо <gcConcurrent enabled="true"/>, либо неопределенным, поскольку это поведение по умолчанию) может вызвать исключение ExecutionEngineException. Кто-нибудь знает статью Microsoft KB или другой источник, который предоставляет дополнительные сведения об этом?

Мы испытали это непосредственно с помощью приложения Windows Service, работающего под управлением NHibernate 3.2, которое, как правило, будет аварийно завершено после нескольких часов работы. Мы смогли отслеживать исключение для вызова ISession.Flush().

Там thread сообщается о том, что похоже на ту же проблему. Его предлагаемый метод обхода, который должен был отключить параллельный GC, до сих пор работал на нас, хотя переход на GC-серверный режим (<gcServer enable="true"/>), который неявно отключает одновременный GC, также сделал трюк.

Прежде чем передать это MS в качестве ошибки, я хотел бы узнать, есть ли у кого-то дополнительная информация о параллельной GC-неустойчивости, о которой упоминает наконечник.

4b9b3361

Ответ 1

Я подозреваю, что это происходит, когда приложение находится под большой нагрузкой, потому что, когда включен параллельный GC, GC пытается сделать это, не приостанавливая ваше приложение. Если GC сталкивается с ситуацией, когда он пытается перемещать память во время фазы сжатия цикла GC и не может перемещать память или не может правильно обновлять указатели приложений, это может привести к тому, что среда выполнения исключение, так как это приведет к потере приложения в потенциально недействительное состояние.

Как отметил в своем комментарии @casperOne, это исключение помечено как устаревшее в .NET 4.0, хотя это не обязательно означает, что GC все еще не может попасть в то же состояние, которое заставило его исключить исключение .NET 3.5. Если GC попал в это же состояние, среда выполнения выдает команду FailFast и прекращает, а не бросает исключение.