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