Я могу рассказать вам о некоторых проблемах, которые у меня были с сборщиком мусора в .NET.
Если вы запускаете приложение, использующее GC сервера (например, приложение ASP.NET), тогда ваша задержка будет действительно ужасна , с паузами около секунды, когда ни один из ваших потоков не может сделать любой прогресс вообще. Это связано с тем, что сервер .NET 4 GC - это глобальный сборщик мусора. По-видимому, в .NET 4.5 будет представлен первый по большей части параллельный сервер Microsoft GC.
Однажды я написал некоторый инструментальный код для измерения задержек в параллельной системе, используя встроенные коллекции, такие как ConcurrentBag
, и продолжал исчерпывать память в 32-битной среде из-за большой фрагментации кучи, потому что .NET GC не выполняет дефрагментацию большого размера. объекты. Мне пришлось заменить основанные на массиве структуры данных чисто функциональными структурами данных, которые разбросаны на миллионы крошечных кусочков, чтобы избежать попадания чего-либо в кучу больших объектов (LOH), вызывающего фрагментацию.
Я обнаружил ошибки в ГХ, такие как этот , из-за которого ГХ теряет память до тех пор, пока не будет исчерпана вся системная память, после чего куча очищается в одном огромном цикле ГХ, который останавливает не только все ваши потоки, но даже другие процессы (потому что система пошла на перестановку) в течение нескольких минут!
Несмотря на то, что в последней версии .NET GC есть настройка «низкая задержка», на самом деле она просто отключает сборку мусора, поэтому ваша программа теряет память до тех пор, пока вы не получите одну большую паузу в GC. Microsoft, похоже, предпочитает обходные пути, подобные этому, которые равносильны высказыванию «напишите свой собственный сборщик мусора, если вы хотите использовать задержку».
Однако .NET GC, как правило, очень хорош, и при осторожном использовании можно получить хорошие результаты. Например, я недавно написал отказоустойчивый сервер, который обеспечивает задержку от двери до двери в среднем 114 мкс с 95% задержек ниже 0,5 мс. Это впечатляюще близко к современному состоянию (см. здесь и здесь ), учитывая, что я сам написал всю платформу на F # всего за несколько месяцев. Сеть фактически способствовала увеличению задержки, чем .NET GC.