У меня странная ситуация, которую я пытаюсь выяснить.
Genesis:
Я запускаю свою программу на физической машине с 16 ядер и 128ГБ ОЗУ.Я пытаюсь определить, почему он не использует все доступные ядра, обычно он использует процессор в среднем на 20-25% (то есть 4-5 ядер из 16).Когда я смотрю на счетчики производительности, они показывают порядка 60-70% времени в сборке мусора.
Для справки, я использую .NET Framework 4 и TPL (Parallel.ForEach) для потоковой передачи производительности.интенсивная часть моей программы.Я ограничиваю количество потоков количеством ядер.
Проблема:
Я создавал большое количество объектов, слишком много для сборщика мусораобрабатывать эффективно и, таким образом, он провел большое количество времени в сборщике мусора.
Простое решение на данный момент:
Я ввел пул объектов, чтобы уменьшить нагрузку на сборщик мусора.Я продолжу объединять объекты в пул для повышения производительности, уже объединяя некоторые объекты, уменьшив сборку мусора с 60–70% времени до 45% времени, и моя программа работала на 40% быстрее.
* 1027один, я надеюсь, вы ответите за меня):
Моя программа при запуске использует не более 14 ГБ доступной оперативной памяти, по сравнению со 128 ГБ ОЗУ, это довольно мало.На этой машине больше ничего не работает (для меня это просто тестовый стенд), и там достаточно оперативной памяти.
- Если имеется достаточно ОЗУ, почему вообще возникают какие-либо коллекции gen2 (или полные)?Встречается довольно большое количество этих коллекций gen2 (в тысячах).то есть как это определяет порог, чтобы начать коллекцию gen2?
- Почему сборщик мусора просто не задерживает полные сборы до тех пор, пока нагрузка на физическую память не достигнет более высокого порога?
- Есть ли способ настроить сборщик мусора так, чтобы он ожидал более высокого порога?(т.е. вообще не надо собирать, если в этом нет необходимости)
РЕДАКТИРОВАТЬ:
Я уже использую возможность использовать серверный сборщик мусора ... чтоМне нужно знать, что вызывает сборку gen2, а не то, что сборщик мусора на сервере лучше (я это уже знаю).